Enrichment x stress MA

Supplementary Material

Setting-up

Loading packages

#devtools::install_github('Mikata-Project/ggthemr', force = TRUE) 

pacman::p_load(tidyverse, 
               here,
               metafor,
               clubSandwich,
               orchaRd, 
               MuMIn,
               patchwork,
               GoodmanKruskal,
               networkD3,
               ggplot2,
               visdat,
               ggalluvial,
               ggthemr, 
               cowplot,
               grDevices,
               png,
               grid,
               gridGraphics,
               pander)
## 
## The downloaded binary packages are in
##  /var/folders/b0/5_1bfml50hj4c3_9l0kzfzyr0000gn/T//RtmpdnAq06/downloaded_packages
# needed for model selection using MuMIn within metafor
eval(metafor:::.MuMIn)

Loading data and functions

This loads the unprocessed datafile and custom functions including: calculating ‘focal’ and ‘pair-wise’ effect sizes and variance calculating SMD *creating VCV of variance

dat <- read_csv(here("Data","Data_raw.csv"))
# Load custom function to extract data 
source(here("R/Functions.R")) 

Data organisation

removing study (Wang et al_2020) with negative values as lnRR cannot be calculated with negative values rounding down sample sizes that are reported as decimals due to averaging n across treatments (rounding down is more conservative), getting effect sizes from function ’flipping’ effect sizes so that all effect sizes are higher values = individuals do better and learning/memory *assigning human readable terms, and creating VCV of variance

# removing study with negative values as these are unable to be used for lnRR
dat <- droplevels(dat[!dat$First_author == 'Wang',])

#rounding down sample sizes
dat$CC_n <- floor(dat$CC_n)
dat$EC_n <- floor(dat$EC_n)
dat$CS_n <- floor(dat$CS_n)
dat$ES_n <- floor(dat$CS_n)

# 'Focal' effect_size 
effect_size <- with(dat, mapply(effect_set, 
                      CC_n ,
                      CC_mean, 
                      CC_SD,
                      EC_n, 
                      EC_mean, 
                      EC_SD,
                      CS_n, 
                      CS_mean, 
                      CS_SD,
                      ES_n, 
                      ES_mean, 
                      ES_SD,
                      percent = Response_percent,
                      SIMPLIFY = FALSE))
effect_size <- map_dfr(effect_size, I)

# 'Pairwise' effect size
 effect_size2 <- with(dat, mapply(effect_set2, 
                      CC_n ,
                      CC_mean, 
                      CC_SD,
                      EC_n, 
                      EC_mean, 
                      EC_SD,
                      CS_n, 
                      CS_mean, 
                      CS_SD,
                      ES_n, 
                      ES_mean, 
                      ES_SD,
                      percent = Response_percent,
                      SIMPLIFY = FALSE))
effect_size2 <- map_dfr(effect_size2, I)

full_info <- which(complete.cases(effect_size) == TRUE)

# adding effect sizes as column
dat <- bind_cols(dat, effect_size, effect_size2)
dat <- dat[full_info, ]

#Flipping 'lower is better' to 'higher is better' effect sizes
#flipping lnRR for values where higher = worse
dat$lnRR_Ea <- ifelse(dat$Response_direction == 2, dat$lnRR_E*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$lnRR_E))
# currently NAswhich causes error
dat$lnRR_Sa  <- ifelse(dat$Response_direction == 2, dat$lnRR_S*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$lnRR_S)) # currently NAswhich causes error
dat$lnRR_ESa <-  ifelse(dat$Response_direction == 2, dat$lnRR_ES*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$lnRR_ES)) # currently NAswhich causes error
#flipping 'pure effect sizes'
dat$lnRR_E2a <- ifelse(dat$Response_direction == 2, dat$lnRR_E2*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$lnRR_E2)) # currently NAswhich causes error
dat$lnRR_S2a  <- ifelse(dat$Response_direction == 2, dat$lnRR_S2*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$lnRR_S2)) # currently NAswhich causes error
dat$lnRR_ES2a <-  ifelse(dat$Response_direction == 2, dat$lnRR_ES2*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$lnRR_ES2)) # currently NAswhich causes error
dat$lnRR_E3a <-  ifelse(dat$Response_direction == 2, dat$lnRR_E3*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$lnRR_E3)) # currently NAswhich causes error
dat$lnRR_S3a <-  ifelse(dat$Response_direction == 2, dat$lnRR_S3*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$lnRR_S3)) # currently NAswhich causes error

#flipping SMD
dat$SMD_Ea <- ifelse(dat$Response_direction == 2, dat$SMD_E*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$SMD_E)) # currently NAswhich causes error
dat$SMD_Sa  <- ifelse(dat$Response_direction == 2, dat$SMD_S*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$SMD_S)) # currently NAswhich causes error
dat$SMD_ESa <-  ifelse(dat$Response_direction == 2, dat$SMD_ES*-1,ifelse(is.na(dat$Response_direction) == TRUE, NA, dat$SMD_ES))

# assigning human readable terms
dat <- dat %>% mutate(Type_assay = case_when(Type_assay == 1 ~ "Habituation",
                                                Type_assay == 2 ~ "Conditioning",
                                                Type_assay == 3 ~ "Recognition", 
                                                Type_assay == 4 ~ "Unclear"),
                      Learning_vs_memory = case_when(Learning_vs_memory == 1 ~ "Learning",
                                                     Learning_vs_memory == 2 ~ "Memory", 
                                                     Learning_vs_memory == 3 ~ "Habituation"),
                      Type_reinforcement = case_when(Type_reinforcement== 1 ~"Appetitive",
                                                         Type_reinforcement== 2 ~ "Aversive",
                                                         Type_reinforcement== 3 ~ "Not applicable",
                                                         Type_reinforcement== 4 ~ "Unclear"),
                      Type_stress_exposure = case_when(Type_stress_exposure == 1 ~ "Density",
                                                       Type_stress_exposure == 2 ~ "Scent",
                                                       Type_stress_exposure == 3 ~ "Shock",
                                                       Type_stress_exposure == 4 ~ "Exertion",
                                                       Type_stress_exposure == 5 ~ "Restraint",
                                                       Type_stress_exposure == 6 ~ "MS",
                                                       Type_stress_exposure == 7 ~ "Circadian rhythm",
                                                       Type_stress_exposure == 8 ~ "Noise",
                                                       Type_stress_exposure == 9 ~ "Other",
                                                       Type_stress_exposure == 10 ~ "Combination",
                                                       Type_stress_exposure == 11 ~ "unclear"), 
                      Age_stress_exposure = case_when(Age_stress_exposure == 1 ~ "Prenatal",
                                                      Age_stress_exposure == 2 ~ "Early postnatal",
                                                      Age_stress_exposure == 3 ~ "Adolescent",
                                                      Age_stress_exposure == 4 ~ "Adult",
                                                      Age_stress_exposure == 5 ~ "Unclear"),
                      Stress_duration = case_when(Stress_duration == 1 ~ "Acute",
                                                  Stress_duration == 2 ~ "Chronic",
                                                  Stress_duration == 3 ~ "Intermittent",
                                                  Stress_duration == 4 ~ "Unclear"),
                      EE_social = case_when(EE_social == 1 ~ "Social",
                                            EE_social== 2 ~ "Non-social", 
                                            EE_social == 3 ~ "Unclear"), 
                      EE_exercise = case_when(EE_exercise == 1 ~ "Exercise", 
                                              EE_exercise == 2 ~ "No exercise"),
                      Age_EE_exposure = case_when(Age_EE_exposure == 1 ~ "Prenatal", 
                                                  Age_EE_exposure == 2 ~ "Early postnatal",
                                                  Age_EE_exposure == 3 ~ "Adolescent", 
                                                  Age_EE_exposure == 4 ~ "Adult",
                                                  Age_EE_exposure == 5 ~ "Unclear"),
                      Exposure_order = case_when(Exposure_order == 1 ~ "Stress first",
                                                      Exposure_order == 2 ~ "Enrichment first",
                                                      Exposure_order == 3 ~ "Concurrently", 
                                                      Exposure_order == 4 ~ "Unclear"),
                      Age_assay = case_when(Age_assay == 1 ~ "Early postnatal",
                                            Age_assay == 2 ~ "Adolescent",
                                            Age_assay == 3 ~ "Adult", 
                                            Age_assay == 4 ~ "Unclear"),
                      Sex = case_when(Sex == 1 ~ "Female", 
                                      Sex == 2 ~ "Male", 
                                      Sex == 3 ~ "Mixed", 
                                      Sex == 4 ~ "Unclear"),
                      Type_EE_exposure = case_when(Type_EE_exposure == 1 ~ "Nesting material",
                                                      Type_EE_exposure == 2 ~ "Objects",
                                                      Type_EE_exposure == 3 ~ "Cage complexity", 
                                                      Type_EE_exposure == 4 ~ "Wheel/trademill",
                                                      Type_EE_exposure == 5 ~ "Combination",
                                                      Type_EE_exposure == 6 ~ "Other", 
                                                      Type_EE_exposure == 7 ~ "Unclear"),
                      ROB_blinding = case_when(ROB_blinding == 1 ~ "Yes",
                                               ROB_blinding == 2 ~ "No",
                                               ROB_blinding == 3 ~ "Unclear"),
                      ROB_randomisation = case_when(ROB_randomisation == 1 ~ "Yes",
                                                    ROB_randomisation == 2 ~ "No",
                                                    ROB_randomisation == 3 ~ "Unclear"))

#making variance VCVs
VCV_E <- impute_covariance_matrix(vi = dat$lnRRV_E, cluster = dat$Study_ID, r = 0.5)
VCV_S <- impute_covariance_matrix(vi = dat$lnRRV_S, cluster = dat$Study_ID, r = 0.5)
VCV_ES <- impute_covariance_matrix(vi = dat$lnRRV_ES, cluster = dat$Study_ID, r = 0.5)

VCV_Ea <- impute_covariance_matrix(vi = dat$SMDV_E, cluster = dat$Study_ID, r = 0.5)
VCV_Sa <- impute_covariance_matrix(vi = dat$SMDV_S, cluster = dat$Study_ID, r = 0.5)
VCV_ESa <- impute_covariance_matrix(vi = dat$SMDV_ES, cluster = dat$Study_ID, r = 0.5)

#write.csv(dat, file = here("Data", 'Data_processed.csv'), row.names = TRUE)

Data exploration

General

number of effect sizes number of studies *publication year range

#Number of effect sizes
length(unique(dat$ES_ID))  

#Number of studies
length(unique(dat$Study_ID))

#Publication years
min(dat$Year_published) 
max(dat$Year_published)

Visual of missing data

plot_missing <- vis_miss(dat) +
  theme(plot.title = element_text(hjust = 0.5, vjust = 3),
        plot.margin = margin(t = 0.5, r = 3, b = 1, l = 1, unit = "cm")) +
  ggtitle("Missing data in the selected predictors") #no missing values

plot_missing

#useGoodman and Kruskal’s τ measure of association between categorical predictor variables (function from package GoodmanKruskal: https://cran.r-project.org/web/packages/GoodmanKruskal/vignettes/GoodmanKruskal.html)
#GKmatrix <- GKtauDataframe(subset(dat, select = c("Sex", "Type_assay", "Learning_vs_memory", #"Type_reinforcement",  "Type_stress_exposure", "Age_stress_exposure", "Stress_duration", #"EE_social_HR", "EE_exercise", "Age_EE_exposure", "Exposure_order", "Age_assay")))
#plot(GKmatrix)

#simple pairwise contingency tables
# table(dat$Type_assay, dat$Type_reinforcement) 
# table(dat$Age_stress_exposure, dat$Age_EE_exposure) 
# table(dat$Type_stress_exposure, dat$Age_stress_exposure)
# table(dat$Type_stress_exposure, dat$Age_assay)
# table(dat$Type_stress_exposure, dat$Stress_duration)

Alluvial diagrams

Shows the relationship/nestedness of different data elements (used for produce Fig. 2)

Subjects info: species-strain-sex

freq_A <- as.data.frame(table(dat$Sex, dat$Common_species, dat$Strain)) %>% rename(Sex = Var1, Species = Var2, Strain = Var3) #make a data frame of frequencies for three selected variables
is_alluvia_form(as.data.frame(freq_A), axes = 1:3, silent = TRUE)

p1 <- ggplot(data = freq_A,
  aes(axis1 = Sex, axis2 = Species, axis3 = Strain, y = Freq)) +
  geom_alluvium(aes(fill = Sex)) +
  geom_flow() +
  geom_stratum(aes(fill = Sex)) +
  geom_text(stat = "stratum", aes(label = after_stat(stratum))) +
  #theme_minimal() +
  theme_void() +
  theme(legend.position = "none",
        plot.title = element_text(hjust = 0, vjust = 3),
        axis.title.x = element_text(),
        axis.text.x = element_text(face="bold"),
        plot.margin = unit(c(1, 1, 0, 1), "cm")) +
  scale_x_discrete(limits = c("Sex", "Species", "Strain"), expand = c(0.15, 0.05), position = "top") +
  ggtitle("A  study subjects")

p1

Environmental enrichment info: age-exercise-social EE

freq_B <- as.data.frame(table(dat$Age_EE_exposure, dat$EE_exercise, dat$EE_social)) %>% rename(Age_EE_exposure = Var1, EE_exercise = Var2, EE_social = Var3) #make a data frame of frequencies for three selected variables
is_alluvia_form(as.data.frame(freq_B), axes = 1:3, silent = TRUE)

p2 <- ggplot(data = freq_B,
  aes(axis1 = Age_EE_exposure, axis2 = EE_exercise, axis3 = EE_social, y = Freq)) +
  geom_alluvium(aes(fill = Age_EE_exposure)) +
  geom_flow() +
  geom_stratum(aes(fill = Age_EE_exposure)) +
  geom_text(stat = "stratum", aes(label = after_stat(stratum))) +
  #theme_minimal() +
  theme_void() +
  theme(legend.position = "none",
        plot.title = element_text(hjust = 0, vjust = 3),
        axis.title.x = element_text(),
        axis.text.x = element_text(face="bold"),
        plot.margin = unit(c(1, 1, 0, 1), "cm")) +
  scale_x_discrete(limits = c("Age", "Exercise", "Social"), expand = c(0.1, 0.1), position = "top") +
  ggtitle("B  environmental enrichment")

p2

Stress info: age-duration-type stress

freq_C <- as.data.frame(table(dat$Age_stress_exposure, dat$Stress_duration, dat$Type_stress_exposure)) %>% rename(Age_stress = Var1, Duration_stress = Var2, Type_stress = Var3) #make a data frame of frequencies for three selected variables
is_alluvia_form(as.data.frame(freq_C), axes = 1:3, silent = TRUE)

p3 <- ggplot(data = freq_C,
  aes(axis1 = Age_stress, axis2 = Duration_stress, axis3 = Type_stress, y = Freq)) +
  geom_alluvium(aes(fill = Age_stress)) +
  geom_flow() +
  geom_stratum(aes(fill = Age_stress)) +
  geom_text(stat = "stratum", aes(label = after_stat(stratum))) +
  #theme_minimal() +
  theme_void() +
  theme(legend.position = "none",
        plot.title = element_text(hjust = 0, vjust = 3),
        axis.title.x = element_text(),
        axis.text.x = element_text(face="bold"),
        plot.margin = unit(c(1, 1, 0, 1), "cm")) +
  scale_x_discrete(limits = c("Age", "Duration", "Type"), expand = c(0.1, 0.1), position = "top") +
  ggtitle("C  stress exposure")

p3

Assay info: LvsM-type-reinforcement

freq_D <- as.data.frame(table(dat$Learning_vs_memory, dat$Type_assay, dat$Type_reinforcement)) %>% rename(Learning_Memory = Var1, Type = Var2, Reinforcement = Var3) #make a data frame of frequencies for three selected variables
is_alluvia_form(as.data.frame(freq_D), axes = 1:3, silent = TRUE)

p4 <- ggplot(data = freq_D,
  aes(axis1 = Learning_Memory, axis2 = Type, axis3 = Reinforcement, y = Freq)) +
  geom_alluvium(aes(fill = Learning_Memory)) +
  geom_flow() +
  geom_stratum(aes(fill = Learning_Memory)) +
  geom_text(stat = "stratum", aes(label = after_stat(stratum))) +
  #theme_minimal() +
  theme_void() +
  theme(legend.position = "none",
        plot.title = element_text(hjust = 0, vjust = 3),
        axis.title.x = element_text(),
        axis.text.x = element_text(face="bold"),
        plot.margin = unit(c(1, 1, 0, 1), "cm")) +
  scale_x_discrete(limits = c("Learning_Memory", "Type", "Reinforcement"), expand = c(0.1, 0.1), position = "top") +
  ggtitle("D  cognitive assay")

p4

Combined plot

Used for Fig. 2

#p1 + scale_fill_brewer(palette = "Set3") #Pastel1

(p1 + scale_fill_brewer(palette = "Set3")) / (p2 + scale_fill_brewer(palette = "Set3")) / (p3 + scale_fill_brewer(palette = "Set3")) / (p4 + scale_fill_brewer(palette = "Set3")) + plot_layout(ncol = 1, heights = c(1,1,1,1,1))

#ggsave(file = "./figs/Alluvial_diagrams_v2.pdf", width = 10, height = 12, units = "cm", dpi = 300, scale = 2) #, device = cairo_pdf)

Modelling with lnRR

Environmental enrichment

Meta-analysis

#dat <- read_csv(here("Data","Data_processed.csv"))

mod_E0 <- rma.mv(yi = lnRR_Ea, V = VCV_E, random = list(~1|Study_ID,
                                                          ~1|ES_ID,
                                                          ~1|Strain),
                 test = "t",
                 data = dat)
summary(mod_E0) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -9.7836   19.5672   27.5672   37.6106   28.0323   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0082  0.0905     30     no  Study_ID 
## sigma^2.2  0.0345  0.1858     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Heterogeneity:
## Q(df = 91) = 809.2712, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.1860  0.0320  5.8116  91  <.0001  0.1224  0.2496  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_E0) 
##     I2_total  I2_Study_ID     I2_ES_ID    I2_Strain 
## 9.310673e-01 1.786605e-01 7.524068e-01 6.097041e-10
orchard_plot(mod_E0, mod = "Int", xlab = "lnRR", alpha=0.4) +  # Orchard plot 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5)+ # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2)+ # confidence intervals
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_colour_manual(values = "darkorange")+ # change colours
  scale_fill_manual(values="darkorange")+ 
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 24), # change font sizes
        legend.title = element_text(size = 15),
        legend.text = element_text(size = 13)) 

Meta-regression: uni-moderator

Learning vs Memory

Was the response learning or memory?

mod_E1 <-  rma.mv(yi = lnRR_Ea, V = VCV_E, mod = ~Learning_vs_memory-1, random = list(~1|Study_ID,
                                                                                        ~1|ES_ID,
                                                                                        ~1|Strain),
                  test = "t",
                  data = dat)

summary(mod_E1) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -9.3793   18.7586   28.7586   41.2577   29.4729   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0076  0.0873     30     no  Study_ID 
## sigma^2.2  0.0340  0.1843     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 802.5794, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 18.2861, p-val < .0001
## 
## Model Results:
## 
##                             estimate      se    tval  df    pval   ci.lb 
## Learning_vs_memoryLearning    0.2303  0.0450  5.1227  90  <.0001  0.1410 
## Learning_vs_memoryMemory      0.1624  0.0355  4.5713  90  <.0001  0.0919 
##                              ci.ub 
## Learning_vs_memoryLearning  0.3197  *** 
## Learning_vs_memoryMemory    0.2330  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_E1) 
##   R2_marginal R2_coditional 
##    0.02572583    1.00000000
LvsM_E<- orchard_plot(mod_E1, mod = "Learning_vs_memory", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  xlim(-0.5, 2) + 
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

LvsM_E

Type of assay

The broad category of the type of assay used to measure learning or memory

dat1 <- filter(dat, Type_assay %in% c("Recognition", "Habituation", "Conditioning"))
VCV_E1 <- impute_covariance_matrix(vi = dat1$lnRRV_E, cluster = dat$Study_ID, r = 0.5)

mod_E2 <- rma.mv(yi = lnRR_Ea, V = VCV_E1, mod = ~Type_assay-1, random = list(~1|Study_ID,
                                                                                  ~1|ES_ID,
                                                                                  ~1|Strain),
                 test = "t",
                 data = dat1)

summary(mod_E2)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -7.8496   15.6993   27.6993   42.6311   28.7237   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0099  0.0995     30     no  Study_ID 
## sigma^2.2  0.0321  0.1792     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 661.8903, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 12.7993, p-val < .0001
## 
## Model Results:
## 
##                         estimate      se    tval  df    pval    ci.lb   ci.ub 
## Type_assayConditioning    0.2167  0.0351  6.1650  89  <.0001   0.1468  0.2865 
## Type_assayHabituation     0.1821  0.1147  1.5886  89  0.1157  -0.0457  0.4100 
## Type_assayRecognition     0.0554  0.0640  0.8659  89  0.3889  -0.0717  0.1826 
##  
## Type_assayConditioning  *** 
## Type_assayHabituation 
## Type_assayRecognition 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_E2) 
##   R2_marginal R2_coditional 
##    0.07376134    1.00000000
Learning_E <- orchard_plot(mod_E2, mod = "Type_assay", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  xlim(-0.5, 2) + 
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Learning_E

Type of reinforcement

If conditioning was used, was aversive or appetitive reinforcement used?

dat2 <- filter(dat, Type_reinforcement %in% c("Appetitive", "Aversive", "Not applicable"))
VCV_E2 <- impute_covariance_matrix(vi = dat2$lnRRV_E, cluster = dat2$Study_ID, r = 0.5)
mod_E3 <- rma.mv(yi = lnRR_Ea, V = VCV_E2, mod = ~ Type_reinforcement-1, random = list(~1|Study_ID,
                                                                                            ~1|ES_ID,
                                                                                            ~1|Strain),
                 test = "t",
                 data = dat2)

summary(mod_E3)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -7.8702   15.7405   27.7405   42.6723   28.7649   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0109  0.1046     30     no  Study_ID 
## sigma^2.2  0.0319  0.1787     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 764.5984, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 12.4138, p-val < .0001
## 
## Model Results:
## 
##                                   estimate      se    tval  df    pval    ci.lb 
## Type_reinforcementAppetitive        0.2175  0.0726  2.9942  89  0.0036   0.0732 
## Type_reinforcementAversive          0.2191  0.0410  5.3456  89  <.0001   0.1377 
## Type_reinforcementNot applicable    0.0812  0.0560  1.4504  89  0.1505  -0.0300 
##                                    ci.ub 
## Type_reinforcementAppetitive      0.3618   ** 
## Type_reinforcementAversive        0.3006  *** 
## Type_reinforcementNot applicable  0.1924      
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_E3) 
##   R2_marginal R2_coditional 
##    0.07720103    1.00000000
Reinforcement_E <-orchard_plot(mod_E3, mod = "Type_reinforcement", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  xlim(-0.5, 2) + 
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Reinforcement_E

Age of enrichment

The age when individuals were exposed to environmental enrichment

dat3 <- filter(dat, Age_EE_exposure %in% c("Adult", "Adolescent"))
VCV_E3 <- impute_covariance_matrix(vi = dat3$lnRRV_E, cluster = dat3$Study_ID, r = 0.5)


mod_E4 <- rma.mv(yi = lnRR_Ea, V = VCV_E3, mod = ~Age_EE_exposure-1, random = list(~1|Study_ID,
                                                                                    ~1|ES_ID,
                                                                                    ~1|Strain),
                 test = "t",
                 data = dat3)

summary(mod_E4) 
## 
## Multivariate Meta-Analysis Model (k = 88; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -6.9490   13.8980   23.8980   36.1698   24.6480   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0078  0.0885     29     no  Study_ID 
## sigma^2.2  0.0327  0.1808     88     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 86) = 782.6092, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 86) = 18.9060, p-val < .0001
## 
## Model Results:
## 
##                            estimate      se    tval  df    pval   ci.lb   ci.ub 
## Age_EE_exposureAdolescent    0.1799  0.0370  4.8553  86  <.0001  0.1062  0.2535 
## Age_EE_exposureAdult         0.2340  0.0620  3.7734  86  0.0003  0.1107  0.3573 
##  
## Age_EE_exposureAdolescent  *** 
## Age_EE_exposureAdult       *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_E4) 
##   R2_marginal R2_coditional 
##    0.01127347    1.00000000
Age_E<- orchard_plot(mod_E4, mod = "Age_EE_exposure", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  xlim(-0.5, 2) + 
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10))  

Age_E

Exercise enrichment

Did enrichment involve the addition of apparatus for voluntary exercise (e.g., a wheel or treadmill)?

mod_E5<- rma.mv(yi = lnRR_Ea, V = VCV_E, mod = ~EE_exercise-1, random = list(~1|Study_ID,
                                                                               ~1|ES_ID,
                                                                               ~1|Strain),
                test = "t",
                data = dat)

summary(mod_E5)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -10.0303   20.0606   30.0606   42.5597   30.7749   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0096  0.0980     30     no  Study_ID 
## sigma^2.2  0.0345  0.1857     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 807.7169, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 16.1666, p-val < .0001
## 
## Model Results:
## 
##                         estimate      se    tval  df    pval   ci.lb   ci.ub 
## EE_exerciseExercise       0.1849  0.0407  4.5464  90  <.0001  0.1041  0.2657 
## EE_exerciseNo exercise    0.1900  0.0556  3.4151  90  0.0010  0.0795  0.3005 
##  
## EE_exerciseExercise     *** 
## EE_exerciseNo exercise  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_E5) 
##   R2_marginal R2_coditional 
##  0.0001360993  0.9999999987
Exercise_E <-orchard_plot(mod_E5, mod = "EE_exercise", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  xlim(-0.5, 2) + 
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Exercise_E

Social enrichment

Did enrichment involve more conspecifics (note that we did not include studies that only provided social enrichment but no other form of abiotic enrichment)?

dat4 <- filter(dat, EE_social %in% c("Social", "Non-social"))
VCV_E4 <- impute_covariance_matrix(vi = dat4$lnRRV_E, cluster = dat4$Study_ID, r = 0.5)
  
mod_E6<- rma.mv(yi = lnRR_Ea, V = VCV_E4, mod = ~EE_social-1, random = list(~1|Study_ID, 
                                                                             ~1|ES_ID,
                                                                             ~1|Strain),
                test = "t",data = dat4)

summary(mod_E6)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -9.3254   18.6507   28.6507   41.1498   29.3650   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0095  0.0974     30     no  Study_ID 
## sigma^2.2  0.0340  0.1844     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 801.5313, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 17.0110, p-val < .0001
## 
## Model Results:
## 
##                      estimate      se    tval  df    pval   ci.lb   ci.ub 
## EE_socialNon-social    0.1413  0.0498  2.8349  90  0.0057  0.0423  0.2403   ** 
## EE_socialSocial        0.2204  0.0432  5.0976  90  <.0001  0.1345  0.3063  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_E6) 
##   R2_marginal R2_coditional 
##    0.03377455    1.00000000
Social_E <-orchard_plot(mod_E6, mod = "EE_social", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  xlim(-0.5, 2) + 
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
       text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Social_E 

Multi-moderator model

The akaike weights for the top set of models with AIC < 6

# filter data so that all K < 5 are removed
dat_Efm <- dat %>%
  filter(Type_assay %in% c("Recognition", "Habituation", "Conditioning"),
         Type_reinforcement %in% c("Appetitive", "Aversive", "Not applicable"),
         EE_social %in% c("Social", "Non-social"), 
         Age_EE_exposure %in% c("Adult", "Adolescent"))

VCV_Efm <- impute_covariance_matrix(vi = dat_Efm$lnRRV_E, cluster = dat_Efm$Study_ID, r = 0.5)
                 
mod_Efm <- rma.mv(yi = lnRR_Sa, V = VCV_Efm, mod = ~Type_assay-1 + Learning_vs_memory + Type_reinforcement + EE_social + EE_exercise + Age_EE_exposure , random =   list(~1|Study_ID,
                                                                                    ~1|ES_ID,
                                                                                    ~1|Strain),
                    test = "t",
                 data = dat_Efm)
#summary(mod_Efm)
#r2_ml(mod_Efm) 

res_Efm <- dredge(mod_Efm, trace=2)
saveRDS(res_Efm, file = here("Rdata", "res_Efm.rds"))
# also saving the full model and data
saveRDS(mod_Efm, file = here("Rdata", "mod_Efm.rds"))
saveRDS(dat_Efm, file = here("Rdata", "dat_Efm.rds"))
dat_Efm <- readRDS(file = here("Rdata", "dat_Efm.rds"))
mod_Efm <- readRDS(file = here("Rdata", "mod_Efm.rds"))
res_Efm <- readRDS(file = here("Rdata", "res_Efm.rds"))
res_Efm2<- subset(res_Efm, delta <= 6, recalc.weights=FALSE)
importance(res_Efm2)
##                      Age_EE_exposure Type_assay EE_exercise EE_social
## Sum of weights:      0.63            0.36       0.16        0.14     
## N containing models:   11              10          5           5     
##                      Learning_vs_memory Type_reinforcement
## Sum of weights:      0.10               0.07              
## N containing models:    4                  4

Publication bias & sensitivity analysis

Publication bias tests

# funnel plot
Funnel_E<-funnel(mod_Efm, xlab = "lnRR", ylab = "Standard Error")

Funnel_E
#year published was scaled previously  under stress PB

dat_Efm$sqrt_inv_e_n <- with(dat_Efm, sqrt(1/CC_n + 1/EC_n + 1/ES_n + 1/CS_n))

PB_MR_E<- rma.mv(lnRR_Sa, lnRRV_S, mods = ~1 + sqrt_inv_e_n +  Learning_vs_memory + Year_published + Type_assay + Type_reinforcement + EE_social + EE_exercise + Age_stress_exposure, random = list(~1|Study_ID,
                                                          ~1|ES_ID,
                                                          ~1|Strain), method = "REML", test = "t", 
    data = dat_Efm)

estimates_PB_MR_E<- estimates.CI(PB_MR_E)
#estimates_PB_MR_E

Leave-one-out analysis

dat$Study_ID <- as.factor(dat$Study_ID)

LeaveOneOut_effectsize <- list()
for(i in 1:length(levels(dat$Study_ID))){
  LeaveOneOut_effectsize[[i]] <- rma.mv(yi = lnRR_Ea, V = lnRRV_E, 
                                        random = list(~1 | Study_ID,~1| ES_ID, ~1 | Strain), 
                                        method = "REML", data = dat[dat$Study_ID
                                                                    != levels(dat$Study_ID)[i], ])}


# writing function for extracting est, ci.lb, and ci.ub from all models
est.func <- function(mod_E0){
  df <- data.frame(est = mod_E0$b, lower = mod_E0$ci.lb, upper = mod_E0$ci.ub)
  return(df)
}


#using dplyr to form data frame
MA_CVR_E <- lapply(LeaveOneOut_effectsize, function(x) est.func(x))%>% bind_rows %>% mutate(left_out = levels(dat$Study_ID))


saveRDS(MA_CVR_E,file = here("Rdata", "MA_CVR_E.rds"))
#telling ggplot to stop reordering factors
MA_CVR_E <- readRDS(file = here("Rdata", "MA_CVR_E.rds"))

MA_CVR_E$left_out<- as.factor(MA_CVR_E$left_out)
MA_CVR_E$left_out<-factor(MA_CVR_E$left_out, levels = MA_CVR_E$left_out)


#plotting
leaveoneout_E <- ggplot(MA_CVR_E) +
  geom_hline(yintercept = 0, lty = 2, lwd = 1) +
  geom_hline(yintercept = mod_E0$ci.lb, lty = 3, lwd = 0.75, colour = "black") +
  geom_hline(yintercept = mod_E0$b, lty = 1, lwd = 0.75, colour = "black") +
  geom_hline(yintercept = mod_E0$ci.ub, lty = 3, lwd = 0.75, colour = "black") +
  geom_pointrange(aes(x = left_out, y = est, ymin = lower, ymax = upper)) +
  xlab("Study left out") + 
  ylab("lnRR, 95% CI") + 
  coord_flip() +
  theme(panel.grid.minor = element_blank())+
  theme_bw() + theme(panel.grid.major = element_blank()) +
  theme(panel.grid.minor.x = element_blank() ) +
  theme(axis.text.y = element_text(size = 6))

leaveoneout_E

dat$Study_ID <- as.integer(dat$Study_ID)

Stress

Meta-analysis

mod_S0 <- rma.mv(yi = lnRR_Sa, V = VCV_S, random = list(~1|Study_ID,
                                                          ~1|ES_ID,
                                                          ~1|Strain),
                 test = "t", 
                 data = dat)

summary(mod_S0) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -14.1156   28.2312   36.2312   46.2747   36.6964   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0099  0.0993     30     no  Study_ID 
## sigma^2.2  0.0377  0.1941     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Heterogeneity:
## Q(df = 91) = 946.9234, p-val < .0001
## 
## Model Results:
## 
## estimate      se     tval  df    pval    ci.lb    ci.ub 
##  -0.1052  0.0337  -3.1217  91  0.0024  -0.1721  -0.0383  ** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_S0) 
##     I2_total  I2_Study_ID     I2_ES_ID    I2_Strain 
## 9.376124e-01 1.946168e-01 7.429955e-01 1.975455e-10
orchard_plot(mod_S0, mod = "Int", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 24), # change font sizes
        legend.title = element_text(size = 15),
        legend.text = element_text(size = 13)) 

Meta-regression: uni-moderator

Learning vs Memory

Was the response learning or memory?

mod_S1 <-  rma.mv(yi = lnRR_Sa, V = VCV_S, mod = ~Learning_vs_memory-1, random = list(~1|Study_ID,
                                                                                        ~1|ES_ID,
                                                                                        ~1|Strain),
                  test = "t",
                  data = dat)

summary(mod_S1) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -14.5281   29.0562   39.0562   51.5553   39.7705   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0094  0.0970     30     no  Study_ID 
## sigma^2.2  0.0388  0.1969     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 946.3930, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 5.0145, p-val = 0.0086
## 
## Model Results:
## 
##                             estimate      se     tval  df    pval    ci.lb 
## Learning_vs_memoryLearning   -0.1211  0.0476  -2.5423  90  0.0127  -0.2157 
## Learning_vs_memoryMemory     -0.0974  0.0380  -2.5648  90  0.0120  -0.1728 
##                               ci.ub 
## Learning_vs_memoryLearning  -0.0265  * 
## Learning_vs_memoryMemory    -0.0219  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_S1) 
##   R2_marginal R2_coditional 
##   0.002776034   1.000000000
LvsM_S <- orchard_plot(mod_S1, mod = "Learning_vs_memory", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
       text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

LvsM_S 

Type of assay

The broad category of the type of assay used to measure learning or memory

dat$Type_assay<-as.factor(dat$Type_assay)

VCV_S1 <- impute_covariance_matrix(vi = dat1$lnRRV_S, cluster = dat$Study_ID, r = 0.5)


mod_S2 <- rma.mv(yi = lnRR_Sa, V = VCV_S1, mod = ~Type_assay-1, random =   list(~1|Study_ID,
                                                                                    ~1|ES_ID,
                                                                                    ~1|Strain),
                 test = "t",
                 data = dat1)

summary(mod_S2)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -9.8028   19.6055   31.6055   46.5374   32.6299   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0161  0.1271     30     no  Study_ID 
## sigma^2.2  0.0279  0.1671     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 723.4973, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 6.7053, p-val = 0.0004
## 
## Model Results:
## 
##                         estimate      se     tval  df    pval    ci.lb    ci.ub 
## Type_assayConditioning   -0.0981  0.0375  -2.6192  89  0.0104  -0.1725  -0.0237 
## Type_assayHabituation    -0.4615  0.1126  -4.0969  89  <.0001  -0.6853  -0.2377 
## Type_assayRecognition    -0.0534  0.0645  -0.8287  89  0.4095  -0.1816   0.0747 
##  
## Type_assayConditioning    * 
## Type_assayHabituation   *** 
## Type_assayRecognition 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_S2) 
##   R2_marginal R2_coditional 
##     0.1853359     1.0000000
Learning_S <-orchard_plot(mod_S2, mod = "Type_assay", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Learning_S

Type of reinforcement

If conditioning was used, was aversive or appetitive reinforcement used?

VCV_S2 <- impute_covariance_matrix(vi = dat2$lnRRV_S, cluster = dat$Study_ID, r = 0.5)

mod_S3 <- rma.mv(yi = lnRR_Sa, V = VCV_S2, mod = ~ Type_reinforcement-1, random = list(~1|Study_ID,
                                                                                            ~1|ES_ID,
                                                                                            ~1|Strain),
                 test = "t",
                 data = dat2)

summary(mod_S3)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -13.8810   27.7621   39.7621   54.6939   40.7864   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0103  0.1016     30     no  Study_ID 
## sigma^2.2  0.0387  0.1966     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 920.8439, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 3.7942, p-val = 0.0130
## 
## Model Results:
## 
##                                   estimate      se     tval  df    pval 
## Type_reinforcementAppetitive       -0.1846  0.0749  -2.4649  89  0.0156 
## Type_reinforcementAversive         -0.0730  0.0427  -1.7081  89  0.0911 
## Type_reinforcementNot applicable   -0.1172  0.0590  -1.9851  89  0.0502 
##                                     ci.lb    ci.ub 
## Type_reinforcementAppetitive      -0.3334  -0.0358  * 
## Type_reinforcementAversive        -0.1579   0.0119  . 
## Type_reinforcementNot applicable  -0.2345   0.0001  . 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_S3) 
##   R2_marginal R2_coditional 
##     0.0366428     1.0000000
Reinforcement_S <-orchard_plot(mod_S3, mod = "Type_reinforcement", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
       text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Reinforcement_S

Age of stress

The age when individuals were exposed to stress

mod_S4 <-rma.mv(yi = lnRR_Sa, V = VCV_S, mod = ~Age_stress_exposure-1, random = list(~1|Study_ID,
                                                                                       ~1|ES_ID,
                                                                                       ~1|Strain),
                test = "t",
                data = dat)
summary(mod_S4) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -12.4083   24.8166   38.8166   56.1579   40.2166   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0048  0.0694     30     no  Study_ID 
## sigma^2.2  0.0392  0.1979     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 88) = 881.1229, p-val < .0001
## 
## Test of Moderators (coefficients 1:4):
## F(df1 = 4, df2 = 88) = 4.3703, p-val = 0.0029
## 
## Model Results:
## 
##                                     estimate      se     tval  df    pval 
## Age_stress_exposureAdolescent         0.0074  0.1159   0.0641  88  0.9490 
## Age_stress_exposureAdult             -0.2279  0.0622  -3.6664  88  0.0004 
## Age_stress_exposureEarly postnatal   -0.0561  0.0435  -1.2891  88  0.2007 
## Age_stress_exposurePrenatal          -0.1145  0.0743  -1.5404  88  0.1271 
##                                       ci.lb    ci.ub 
## Age_stress_exposureAdolescent       -0.2228   0.2377      
## Age_stress_exposureAdult            -0.3514  -0.1044  *** 
## Age_stress_exposureEarly postnatal  -0.1425   0.0304      
## Age_stress_exposurePrenatal         -0.2621   0.0332      
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_S4) 
##   R2_marginal R2_coditional 
##    0.09987307    1.00000000
Age_S <- orchard_plot(mod_S4, mod = "Age_stress_exposure", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Age_S 

Type of stress

The type of stressor used

dat5 <- filter(dat, Type_stress_exposure %in% c("Restraint", "Noise", "MS", "Combination"))
VCV_S3 <- impute_covariance_matrix(vi = dat5$lnRRV_S, cluster = dat5$Study_ID, r = 0.5)

mod_S4 <- rma.mv(yi = lnRR_Sa, V = VCV_S3, mod = ~Type_stress_exposure-1, random = list(~1|Study_ID,
                                                                                         ~1|ES_ID,
                                                                                         ~1|Strain),
                 test = "t",
                 data = dat5)
summary(mod_S4) 
## 
## Multivariate Meta-Analysis Model (k = 85; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -11.4138   22.8276   36.8276   53.5887   38.3618   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0115  0.1071     25     no  Study_ID 
## sigma^2.2  0.0401  0.2002     85     no     ES_ID 
## sigma^2.3  0.0000  0.0000      4     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 81) = 897.4553, p-val < .0001
## 
## Test of Moderators (coefficients 1:4):
## F(df1 = 4, df2 = 81) = 2.8767, p-val = 0.0278
## 
## Model Results:
## 
##                                  estimate      se     tval  df    pval    ci.lb 
## Type_stress_exposureCombination   -0.0500  0.0892  -0.5605  81  0.5767  -0.2274 
## Type_stress_exposureMS            -0.0539  0.0560  -0.9630  81  0.3384  -0.1653 
## Type_stress_exposureNoise         -0.1203  0.1036  -1.1608  81  0.2491  -0.3265 
## Type_stress_exposureRestraint     -0.2101  0.0704  -2.9863  81  0.0037  -0.3501 
##                                    ci.ub 
## Type_stress_exposureCombination   0.1274     
## Type_stress_exposureMS            0.0575     
## Type_stress_exposureNoise         0.0859     
## Type_stress_exposureRestraint    -0.0701  ** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_S4)
##   R2_marginal R2_coditional 
##    0.07029554    1.00000000
Stressor<- orchard_plot(mod_S4, mod = "Type_stress_exposure", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Stressor

Stess duration

Was the stress acute or chronic?

dat6 <- filter(dat, Stress_duration %in% c("Chronic", "Acute"))
VCV_S4 <- impute_covariance_matrix(vi = dat6$lnRRV_S, cluster = dat6$Study_ID, r = 0.5)

mod_S5 <-rma.mv(yi = lnRR_Sa, V = VCV_S4, mod = ~Stress_duration-1, random = list(~1|Study_ID,
                                                                                   ~1|ES_ID,
                                                                                   ~1|Strain),
                test = "t",
                data = dat6)
summary(mod_S5) 
## 
## Multivariate Meta-Analysis Model (k = 89; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -13.7898   27.5796   37.5796   49.9092   38.3204   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0062  0.0786     29     no  Study_ID 
## sigma^2.2  0.0391  0.1978     89     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 87) = 915.9393, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 87) = 6.6661, p-val = 0.0020
## 
## Model Results:
## 
##                         estimate      se     tval  df    pval    ci.lb    ci.ub 
## Stress_durationAcute      0.0135  0.0659   0.2045  87  0.8384  -0.1176   0.1445 
## Stress_durationChronic   -0.1360  0.0373  -3.6456  87  0.0005  -0.2101  -0.0618 
##  
## Stress_durationAcute 
## Stress_durationChronic  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_S5) 
##   R2_marginal R2_coditional 
##    0.08245896    1.00000000
Duration_S <- orchard_plot(mod_S5, mod = "Stress_duration", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Duration_S 

Multi-moderator model

The akaike weights for the top set of models with AIC < 6

#selecting moderator levels with k >=5
dat_Sfm <- dat %>%
  filter(Type_assay %in% c("Recognition", "Habituation", "Conditioning"),
         Type_reinforcement %in% c("Appetitive", "Aversive", "Not applicable"),
         Type_stress_exposure %in% c("Restraint", "Noise", "MS", "Combination"),
         Stress_duration %in% c("Chronic", "Acute"))

VCV_Sfm <- impute_covariance_matrix(vi = dat_Sfm$lnRRV_E, cluster = dat_Sfm$Study_ID, r = 0.5)
                 
mod_Sfm <- rma.mv(yi = lnRR_Sa, V = VCV_Sfm, mod = ~ Type_assay -1 + Learning_vs_memory + Type_reinforcement + Type_stress_exposure + Age_stress_exposure + Stress_duration, random =   list(~1|Study_ID,
                                                                                    ~1|ES_ID,
                                                                                    ~1|Strain),
                    test = "t",
                 data = dat_Sfm)
#summary(mod_Sfm)
#r2_ml(mod_Sfm) 

res_Sfm <- dredge(mod_Sfm, trace=2)
saveRDS(res_Sfm, file = here("Rdata", "res_Sfm.rds"))
# also saving the full model and data
saveRDS(mod_Sfm, file = here("Rdata", "mod_Sfm.rds"))
saveRDS(dat_Sfm, file = here("Rdata", "dat_Sfm.rds"))
dat_Sfm <- readRDS(file = here("Rdata", "dat_Sfm.rds"))
mod_Sfm <- readRDS(file = here("Rdata", "mod_Sfm.rds"))
res_Sfm <- readRDS(file = here("Rdata", "res_Sfm.rds"))
res_Sfm2<- subset(res_Sfm, delta <= 6, recalc.weights=FALSE)
importance(res_Sfm2) 
##                      Type_assay Stress_duration Type_stress_exposure
## Sum of weights:      0.91       0.88            0.22                
## N containing models:    7          6               2                
##                      Learning_vs_memory Age_stress_exposure Type_reinforcement
## Sum of weights:      0.16               0.04                0.04              
## N containing models:    2                  1                   1

Publication bias & sensitivity analysis

Publication bias

# funnel plot
Funnel_S <- funnel(mod_Sfm, xlab = "lnRR", ylab = "Standard Error")

Funnel_S

#calculating inv effective sample size for use in full meta-regression
dat_Sfm$sqrt_inv_e_n <- with(dat_Sfm, sqrt(1/CC_n + 1/EC_n + 1/ES_n + 1/CS_n))

#time lag bias and eggers regression
dat_Sfm$c_Year_published <- as.vector(scale(dat_Sfm$Year_published, scale = F))

PB_MR_S<- rma.mv(lnRR_Sa, lnRRV_S, mods = ~1 + sqrt_inv_e_n +  c_Year_published + Type_assay +Learning_vs_memory + Type_reinforcement + Type_stress_exposure + Age_stress_exposure, random = list(~1|Study_ID,
                                                          ~1|ES_ID,
                                                          ~1|Strain), 
                 method = "REML", 
                 test = "t", 
                 data = dat_Sfm,
                  control=list(optimizer="optim", optmethod="Nelder-Mead"))

estimates_PB_MR_S<- estimates.CI(PB_MR_S)
#estimates_PB_MR_S

Leave-one-out sensitivity analysis

dat$Study_ID <- as.factor(dat$Study_ID)

LeaveOneOut_effectsize <- list()
for(i in 1:length(levels(dat$Study_ID))){
  LeaveOneOut_effectsize[[i]] <- rma.mv(yi = lnRR_Sa, V = lnRRV_S, 
                                        random = list(~1 | Study_ID,~1| ES_ID, ~1 | Strain), 
                                        method = "REML", data = dat[dat$Study_ID
                                                                    != levels(dat$Study_ID)[i], ])}


# writing function for extracting est, ci.lb, and ci.ub from all models
est.func <- function(mod_E0){
  df <- data.frame(est = mod_E0$b, lower = mod_E0$ci.lb, upper = mod_E0$ci.ub)
  return(df)
}


#using dplyr to form data frame
MA_CVR_S <- lapply(LeaveOneOut_effectsize, function(x) est.func(x))%>% bind_rows %>% mutate(left_out = levels(dat$Study_ID))

saveRDS(MA_CVR_S,file = here("Rdata", "MA_CVR_S.rds"))
MA_CVR_S <- readRDS(file = here("Rdata", "MA_CVR_S.rds"))

#telling ggplot to stop reordering factors
MA_CVR_S$left_out<- as.factor(MA_CVR_S$left_out)
MA_CVR_S$left_out<-factor(MA_CVR_S$left_out, levels = MA_CVR_S$left_out)

#plotting
leaveoneout_S <- ggplot(MA_CVR_S) +
  geom_hline(yintercept = 0, lty = 2, lwd = 1) +
  geom_hline(yintercept = mod_S0$ci.lb, lty = 3, lwd = 0.75, colour = "black") +
  geom_hline(yintercept = mod_S0$b, lty = 1, lwd = 0.75, colour = "black") +
  geom_hline(yintercept = mod_S0$ci.ub, lty = 3, lwd = 0.75, colour = "black") +
  geom_pointrange(aes(x = left_out, y = est, ymin = lower, ymax = upper)) +
  xlab("Study left out") + 
  ylab("lnRR, 95% CI") + 
  coord_flip() +
  theme(panel.grid.minor = element_blank())+
  theme_bw() + theme(panel.grid.major = element_blank()) +
  theme(panel.grid.minor.x = element_blank() ) +
  theme(axis.text.y = element_text(size = 6))

leaveoneout_S

dat$Study_ID <- as.integer(dat$Study_ID)

Interaction of stress and EE

Meta-analysis

mod_ES0 <- rma.mv(yi = lnRR_ESa, V = VCV_ES, random = list(~1|Study_ID,
                                                             ~1|ES_ID,
                                                             ~1|Strain),
                  test = "t", 
                  data = dat)

summary(mod_ES0) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -40.8178   81.6355   89.6355   99.6790   90.1006   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0316  0.1777     30     no  Study_ID 
## sigma^2.2  0.0229  0.1513     92     no     ES_ID 
## sigma^2.3  0.0030  0.0544      6     no    Strain 
## 
## Test for Heterogeneity:
## Q(df = 91) = 303.2179, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.1229  0.0596  2.0605  91  0.0422  0.0044  0.2414  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_ES0) 
##    I2_total I2_Study_ID    I2_ES_ID   I2_Strain 
##  0.81703063  0.44913873  0.32576306  0.04212884
orchard_plot(mod_ES0, mod = "Int", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 24), # change font sizes
        legend.title = element_text(size = 15),
        legend.text = element_text(size = 13)) 

Meta-regression: uni-moderator

Learning vs Memory

Was the response learning or memory?

mod_ES1 <-  rma.mv(yi = lnRR_ESa, V = VCV_ES, mod = ~Learning_vs_memory-1, random = list(~1|Study_ID, 
                                                                                           ~1|ES_ID,
                                                                                           ~1|Strain),
                   test = "t",
                   data = dat)

summary(mod_ES1) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -40.4769   80.9539   90.9539  103.4529   91.6682   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0292  0.1708     30     no  Study_ID 
## sigma^2.2  0.0232  0.1524     92     no     ES_ID 
## sigma^2.3  0.0034  0.0582      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 299.1854, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 2.9219, p-val = 0.0590
## 
## Model Results:
## 
##                             estimate      se    tval  df    pval    ci.lb 
## Learning_vs_memoryLearning    0.1744  0.0722  2.4166  90  0.0177   0.0310 
## Learning_vs_memoryMemory      0.1057  0.0619  1.7065  90  0.0914  -0.0174 
##                              ci.ub 
## Learning_vs_memoryLearning  0.3178  * 
## Learning_vs_memoryMemory    0.2288  . 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES1) 
##   R2_marginal R2_coditional 
##     0.0197648     0.9405080
LvsM_ES <- orchard_plot(mod_ES1, mod = "Learning_vs_memory", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

LvsM_ES 

Type of assay

The broad category of the type of assay used to measure learning or memory

VCV_ES1 <- impute_covariance_matrix(vi = dat1$lnRRV_ES, cluster = dat$Study_ID, r = 0.5)

mod_ES2 <- rma.mv(yi = lnRR_ESa, V = VCV_ES1, mod = ~Type_assay-1, random = list(~1|Study_ID,
                                                                                    ~1|ES_ID,
                                                                                    ~1|Strain),
                  test = "t",
                  data = dat1)

summary(mod_ES2)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -39.0874   78.1748   90.1748  105.1066   91.1992   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0370  0.1924     30     no  Study_ID 
## sigma^2.2  0.0192  0.1386     92     no     ES_ID 
## sigma^2.3  0.0018  0.0422      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 293.9385, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 3.1062, p-val = 0.0305
## 
## Model Results:
## 
##                         estimate      se     tval  df    pval    ci.lb   ci.ub 
## Type_assayConditioning    0.1525  0.0589   2.5877  89  0.0113   0.0354  0.2696 
## Type_assayHabituation     0.1990  0.1415   1.4070  89  0.1629  -0.0820  0.4801 
## Type_assayRecognition    -0.0048  0.0800  -0.0606  89  0.9518  -0.1637  0.1541 
##  
## Type_assayConditioning  * 
## Type_assayHabituation 
## Type_assayRecognition 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES2) 
##   R2_marginal R2_coditional 
##    0.05775809    0.97105550
Learning_ES <- orchard_plot(mod_ES2, mod = "Type_assay", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Learning_ES

Type of reinforcement

If conditioning was used, was aversive or appetitive reinforcement used?

VCV_ES2 <- impute_covariance_matrix(vi = dat2$lnRRV_ES, cluster = dat2$Study_ID, r = 0.5)

mod_ES3 <- rma.mv(yi = lnRR_ESa, V = VCV_ES2, mod = ~ Type_reinforcement-1, random = list(~1|Study_ID,
                                                                                               ~1|ES_ID,
                                                                                               ~1|Strain),
                  test = "t",
                  data = dat2)

summary(mod_ES3)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -39.0604   78.1208   90.1208  105.0526   91.1452   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0382  0.1954     30     no  Study_ID 
## sigma^2.2  0.0189  0.1377     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 293.4724, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 3.2547, p-val = 0.0254
## 
## Model Results:
## 
##                                   estimate      se    tval  df    pval    ci.lb 
## Type_reinforcementAppetitive        0.1007  0.1075  0.9366  89  0.3515  -0.1129 
## Type_reinforcementAversive          0.1573  0.0569  2.7618  89  0.0070   0.0441 
## Type_reinforcementNot applicable    0.0147  0.0702  0.2101  89  0.8341  -0.1247 
##                                    ci.ub 
## Type_reinforcementAppetitive      0.3143     
## Type_reinforcementAversive        0.2704  ** 
## Type_reinforcementNot applicable  0.1541     
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES3) 
##   R2_marginal R2_coditional 
##     0.0586952     1.0000000
Reinforcement_ES <- orchard_plot(mod_ES3, mod = "Type_reinforcement", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Reinforcement_ES 

Age of enrichment

The age when individuals were exposed to environmental enrichment

VCV_ES3 <- impute_covariance_matrix(vi = dat3$lnRRV_ES, cluster = dat3$Study_ID, r = 0.5)

mod_ES4 <- rma.mv(yi = lnRR_ESa, V = VCV_ES3, mod = ~Age_EE_exposure-1, random = list(~1|Study_ID,
                                                                                    ~1|ES_ID,
                                                                                    ~1|Strain),
                 test = "t",
                 data = dat3)

summary(mod_ES4) 
## 
## Multivariate Meta-Analysis Model (k = 88; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -36.6407   73.2813   83.2813   95.5531   84.0313   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0332  0.1822     29     no  Study_ID 
## sigma^2.2  0.0207  0.1439     88     no     ES_ID 
## sigma^2.3  0.0007  0.0265      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 86) = 288.6493, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 86) = 3.1308, p-val = 0.0487
## 
## Model Results:
## 
##                            estimate      se    tval  df    pval    ci.lb 
## Age_EE_exposureAdolescent    0.1284  0.0583  2.2006  86  0.0304   0.0124 
## Age_EE_exposureAdult         0.1247  0.0921  1.3538  86  0.1793  -0.0584 
##                             ci.ub 
## Age_EE_exposureAdolescent  0.2444  * 
## Age_EE_exposureAdult       0.3077    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES4) 
##   R2_marginal R2_coditional 
##  0.0000400928  0.9871095822
Age_enrichment_ES <- orchard_plot(mod_ES4, mod = "Age_EE_exposure", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
       axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Age_enrichment_ES

Exercise enrichment

Did enrichment involve the addition of apparatus for voluntary exercise (e.g., a wheel or treadmill)?

mod_ES5<- rma.mv(yi = lnRR_ESa, V = VCV_ES, mod = ~EE_exercise-1, random = list(~1|Study_ID, 
    ~1|ES_ID,
    ~1|Strain),
     test = "t",
     data = dat)

summary(mod_ES5)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -40.4968   80.9935   90.9935  103.4926   91.7078   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0325  0.1803     30     no  Study_ID 
## sigma^2.2  0.0230  0.1517     92     no     ES_ID 
## sigma^2.3  0.0065  0.0805      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 297.3270, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 1.8401, p-val = 0.1647
## 
## Model Results:
## 
##                         estimate      se    tval  df    pval    ci.lb   ci.ub 
## EE_exerciseExercise       0.1051  0.0780  1.3474  90  0.1812  -0.0499  0.2602 
## EE_exerciseNo exercise    0.1687  0.0967  1.7448  90  0.0844  -0.0234  0.3609 
##  
## EE_exerciseExercise 
## EE_exerciseNo exercise  . 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES5) 
##   R2_marginal R2_coditional 
##    0.01474459    0.89712469
Exercise_ES <- orchard_plot(mod_ES5, mod = "EE_exercise", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
       axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Exercise_ES

Social enrichment

Did enrichment involve more conspecifics (note that we did not include studies that only provided social enrichment but no other form of abiotic enrichment)?

VCV_ES4 <- impute_covariance_matrix(vi = dat4$lnRRV_ES, cluster = dat4$Study_ID, r = 0.5)
mod_ES6<- rma.mv(yi = lnRR_ESa, V = VCV_ES4, mod = ~EE_social-1, random = list(~1|Study_ID,
                                                                                ~1|ES_ID,
                                                                                ~1|Strain),
                 test = "t",
                 data = dat4)

summary(mod_ES6)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -40.1871   80.3742   90.3742  102.8733   91.0885   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0311  0.1762     30     no  Study_ID 
## sigma^2.2  0.0230  0.1518     92     no     ES_ID 
## sigma^2.3  0.0046  0.0676      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 302.0860, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 2.4198, p-val = 0.0947
## 
## Model Results:
## 
##                      estimate      se    tval  df    pval    ci.lb   ci.ub 
## EE_socialNon-social    0.0750  0.0807  0.9300  90  0.3549  -0.0853  0.2353    
## EE_socialSocial        0.1720  0.0788  2.1842  90  0.0315   0.0156  0.3285  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES6) 
##   R2_marginal R2_coditional 
##    0.03751906    0.92501263
Social_ES <- orchard_plot(mod_ES6, mod = "EE_social", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Social_ES

Age of stress

The age when individuals were exposed to stress

mod_ES7 <-rma.mv(yi = lnRR_ESa, V = VCV_ES, mod = ~Age_stress_exposure-1, random = list(~1|Study_ID,
                                                                                          ~1|ES_ID,
                                                                                          ~1|Strain),
                 test = "t",
                 data = dat)
summary(mod_ES7) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -39.0917   78.1834   92.1834  109.5247   93.5834   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0295  0.1718     30     no  Study_ID 
## sigma^2.2  0.0232  0.1522     92     no     ES_ID 
## sigma^2.3  0.0091  0.0954      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 88) = 286.4225, p-val < .0001
## 
## Test of Moderators (coefficients 1:4):
## F(df1 = 4, df2 = 88) = 1.5932, p-val = 0.1832
## 
## Model Results:
## 
##                                     estimate      se     tval  df    pval 
## Age_stress_exposureAdolescent        -0.0137  0.1762  -0.0775  88  0.9384 
## Age_stress_exposureAdult              0.1677  0.1140   1.4708  88  0.1449 
## Age_stress_exposureEarly postnatal    0.1067  0.0920   1.1602  88  0.2491 
## Age_stress_exposurePrenatal           0.3179  0.1311   2.4254  88  0.0173 
##                                       ci.lb   ci.ub 
## Age_stress_exposureAdolescent       -0.3639  0.3366    
## Age_stress_exposureAdult            -0.0589  0.3942    
## Age_stress_exposureEarly postnatal  -0.0761  0.2896    
## Age_stress_exposurePrenatal          0.0574  0.5784  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES7) 
##   R2_marginal R2_coditional 
##    0.09276574    0.86630830
Age_stress_ES<-orchard_plot(mod_ES7, mod = "Age_stress_exposure", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
       axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Age_stress_ES

Type of stress

The type of stressor used

VCV_ES5 <- impute_covariance_matrix(vi = dat5$lnRRV_ES, cluster = dat5$Study_ID, r = 0.5)
mod_ES8 <- rma.mv(yi = lnRR_ESa, V = VCV_ES5, mod = ~Type_stress_exposure-1, random = list(~1|Study_ID,
                                                                                            ~1|ES_ID,
                                                                                            ~1|Strain),
                  test = "t",
                  data = dat5)
summary(mod_ES8)
## 
## Multivariate Meta-Analysis Model (k = 85; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -34.4046   68.8091   82.8091   99.5703   84.3434   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0426  0.2064     25     no  Study_ID 
## sigma^2.2  0.0232  0.1524     85     no     ES_ID 
## sigma^2.3  0.0104  0.1021      4     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 81) = 281.9708, p-val < .0001
## 
## Test of Moderators (coefficients 1:4):
## F(df1 = 4, df2 = 81) = 0.5137, p-val = 0.7258
## 
## Model Results:
## 
##                                  estimate      se    tval  df    pval    ci.lb 
## Type_stress_exposureCombination    0.1111  0.1458  0.7618  81  0.4484  -0.1790 
## Type_stress_exposureMS             0.1185  0.1099  1.0784  81  0.2840  -0.1001 
## Type_stress_exposureNoise          0.1651  0.1795  0.9198  81  0.3604  -0.1920 
## Type_stress_exposureRestraint      0.1374  0.1252  1.0978  81  0.2755  -0.1116 
##                                   ci.ub 
## Type_stress_exposureCombination  0.4011    
## Type_stress_exposureMS           0.3370    
## Type_stress_exposureNoise        0.5221    
## Type_stress_exposureRestraint    0.3865    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES8)
##   R2_marginal R2_coditional 
##   0.004455703   0.863910284
Stressor_ES <- orchard_plot(mod_ES8, mod = "Type_stress_exposure", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7))  

Stressor_ES 

Stress duration

Was the stress acute or chronic?

VCV_ES6 <- impute_covariance_matrix(vi = dat6$lnRRV_ES, cluster = dat6$Study_ID, r = 0.5)

mod_ES9 <-rma.mv(yi = lnRR_ESa, V = VCV_ES6, mod = ~Stress_duration-1, random = list(~1|Study_ID,
                                                                                      ~1|ES_ID,
                                                                                      ~1|Strain),
                 test = "t",
                 data = dat6)
summary(mod_ES9) 
## 
## Multivariate Meta-Analysis Model (k = 89; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -35.9010   71.8020   81.8020   94.1315   82.5427   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0133  0.1155     29     no  Study_ID 
## sigma^2.2  0.0260  0.1611     89     no     ES_ID 
## sigma^2.3  0.0080  0.0895      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 87) = 278.4877, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 87) = 4.3877, p-val = 0.0153
## 
## Model Results:
## 
##                         estimate      se     tval  df    pval    ci.lb   ci.ub 
## Stress_durationAcute     -0.0367  0.0930  -0.3946  87  0.6941  -0.2216  0.1482 
## Stress_durationChronic    0.1854  0.0732   2.5347  87  0.0130   0.0400  0.3308 
##  
## Stress_durationAcute 
## Stress_durationChronic  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES9) 
##   R2_marginal R2_coditional 
##     0.1598311     0.8575918
Duration_ES<- orchard_plot(mod_ES9, mod = "Stress_duration", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Duration_ES

Order to treatment exposure

The order in which individuals were exposed to enrichment and stress

mod_ES10 <- rma.mv(yi = lnRR_ESa, V = VCV_ES, mod = ~Exposure_order -1, random = list(~1|Study_ID, 
    ~1|ES_ID,
    ~1|Strain),
     test = "t",
     data = dat)

summary(mod_ES10)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -39.0408   78.0817   90.0817  105.0135   91.1061   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0316  0.1777     30     no  Study_ID 
## sigma^2.2  0.0227  0.1507     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 292.2561, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 3.1546, p-val = 0.0287
## 
## Model Results:
## 
##                                 estimate      se     tval  df    pval    ci.lb 
## Exposure_orderConcurrently        0.1492  0.1208   1.2351  89  0.2201  -0.0909 
## Exposure_orderEnrichment first   -0.1782  0.1659  -1.0744  89  0.2856  -0.5079 
## Exposure_orderStress first        0.1370  0.0526   2.6046  89  0.0108   0.0325 
##                                  ci.ub 
## Exposure_orderConcurrently      0.3893    
## Exposure_orderEnrichment first  0.1514    
## Exposure_orderStress first      0.2414  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES10)
##   R2_marginal R2_coditional 
##     0.1027207     1.0000000
Order_ES <- orchard_plot(mod_ES10, mod = "Exposure_order", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Order_ES 

Multi-moderator model

The akaike weights for the top set of models with AIC < 6

dat_ESfm <- dat %>%
  filter(Type_assay %in% c("Recognition", "Habituation", "Conditioning"),
         Type_reinforcement %in% c("Appetitive", "Aversive", "Not applicable"),
         EE_social %in% c("Social", "Non-social"),
         Age_EE_exposure %in% c("Adult", "Adolescent"),
         Type_stress_exposure %in% c("Restraint", "Noise", "MS", "Combination"),
         Stress_duration %in% c("Chronic", "Acute"), 
         Age_stress_exposure %in% c("Prenatal", "Early postnatal", "Adult"))

VCV_ESfm <- impute_covariance_matrix(vi = dat_ESfm$lnRRV_ES, cluster = dat_ESfm$Study_ID, r = 0.5)
                 
mod_ESfm <- rma.mv(yi = lnRR_Sa, V = VCV_ESfm, mod = ~Type_assay-1 + Learning_vs_memory + Type_reinforcement + EE_social + EE_exercise + Age_EE_exposure + Type_stress_exposure + Age_stress_exposure + Stress_duration + Exposure_order, random =   list(~1|Study_ID,
                                                                                    ~1|ES_ID,
                                                                                    ~1|Strain),
                    test = "t",
                 data = dat_ESfm)
#summary(mod_ESfm)
#r2_ml(mod_ESfm) 


res_ESfm <- dredge(mod_ESfm, trace=2)
saveRDS(res_ESfm, file = here("Rdata", "res_ESfm.rds"))
# also saving the full model and data
saveRDS(mod_ESfm, file = here("Rdata", "mod_ESfm.rds"))
saveRDS(dat_ESfm, file = here("Rdata", "dat_ESfm.rds"))
dat_ESfm <- readRDS(file = here("Rdata", "dat_ESfm.rds"))
mod_ESfm <- readRDS(file = here("Rdata", "mod_ESfm.rds"))
res_ESfm <- readRDS(file = here("Rdata", "res_ESfm.rds"))
res_ESfm2<- subset(res_ESfm, delta <= 6, recalc.weights=FALSE)
importance(res_ESfm2) 
##                      Type_assay Stress_duration Age_EE_exposure EE_exercise
## Sum of weights:      0.65       0.63            0.26            0.11       
## N containing models:   19         18               7               6       
##                      Learning_vs_memory EE_social Age_stress_exposure
## Sum of weights:      0.08               0.08      0.05               
## N containing models:    4                  4         2               
##                      Type_stress_exposure Exposure_order
## Sum of weights:      0.03                 0.02          
## N containing models:    2                    1

Publication bias & sensitivity analysis

Publication bias

Funnel_ES<-funnel(mod_ESfm, xlab = "lnRR", ylab = "Standard Error")

Funnel_ES
#year published was scaled previously under stress PB

dat_ESfm$sqrt_inv_e_n <- with(dat_ESfm, sqrt(1/CC_n + 1/EC_n + 1/ES_n + 1/CS_n))

PB_MR_ES<- rma.mv(lnRR_ESa, lnRRV_ES, mods = ~1 + sqrt_inv_e_n +  Year_published + Learning_vs_memory + Type_assay + Type_reinforcement + EE_social + EE_exercise + Age_stress_exposure, random = list(~1|Study_ID,
                                                          ~1|ES_ID,
                                                          ~1|Strain), method = "REML", test = "t", 
    data = dat_ESfm)

estimates_PB_MR_ES<- estimates.CI(PB_MR_ES)
#estimates_PB_MR_ES

Leave-one-out analysis

dat$Study_ID <- as.factor(dat$Study_ID)

LeaveOneOut_effectsize <- list()
for(i in 1:length(levels(dat$Study_ID))){
  LeaveOneOut_effectsize[[i]] <- rma.mv(yi = lnRR_Ea, V = lnRRV_E, 
                                        random = list(~1 | Study_ID,~1| ES_ID, ~1 | Strain), 
                                        method = "REML", data = dat[dat$Study_ID
                                                                    != levels(dat$Study_ID)[i], ])}


# writing function for extracting est, ci.lb, and ci.ub from all models
est.func <- function(mod_E0){
  df <- data.frame(est = mod_E0$b, lower = mod_E0$ci.lb, upper = mod_E0$ci.ub)
  return(df)
}


#using dplyr to form data frame
MA_CVR_ES <- lapply(LeaveOneOut_effectsize, function(x) est.func(x))%>% bind_rows %>% mutate(left_out = levels(dat$Study_ID))

saveRDS(MA_CVR_ES, ,file = here("Rdata", "MA_CVR_ES.rds"))
MA_CVR_ES<- readRDS(here("Rdata", "MA_CVR_ES.rds"))

#telling ggplot to stop reordering factors
MA_CVR_ES$left_out<- as.factor(MA_CVR_ES$left_out)
MA_CVR_ES$left_out<-factor(MA_CVR_ES$left_out, levels = MA_CVR_ES$left_out)

#plotting
leaveoneout_ES <- ggplot(MA_CVR_ES) +
  geom_hline(yintercept = 0, lty = 2, lwd = 1) +
  geom_hline(yintercept = mod_E0$ci.lb, lty = 3, lwd = 0.75, colour = "black") +
  geom_hline(yintercept = mod_E0$b, lty = 1, lwd = 0.75, colour = "black") +
  geom_hline(yintercept = mod_E0$ci.ub, lty = 3, lwd = 0.75, colour = "black") +
  geom_pointrange(aes(x = left_out, y = est, ymin = lower, ymax = upper)) +
  xlab("Study left out") + 
  ylab("lnRR, 95% CI") + 
  coord_flip() +
  theme(panel.grid.minor = element_blank())+
  theme_bw() + theme(panel.grid.major = element_blank()) +
  theme(panel.grid.minor.x = element_blank() ) +
  theme(axis.text.y = element_text(size = 6))

leaveoneout_ES

dat$Study_ID <- as.integer(dat$Study_ID)

Combined orchard plot

mod_list1 <- list(mod_E0, mod_S0, mod_ES0)

mod_res1 <- lapply(mod_list1, function(x) mod_results(x, mod = "Int"))

merged1 <- submerge(mod_res1[[3]], mod_res1[[2]],  mod_res1[[1]], mix = T)
merged1$mod_table$name <- factor(merged1$mod_table$name, levels = c("Intrcpt1", 
    "Intrcpt2", "Intrcpt3"), 
    labels = rev(c("Enrichment ME", "Stress ME", "Interaction")))

merged1$data$moderator <- factor(merged1$data$moderator, levels = c("Intrcpt1", 
    "Intrcpt2", "Intrcpt3"), 
    labels = rev(c("Enrichment ME", "Stress ME", "Interaction")))

orchard1<- orchard_plot(merged1, mod = "Int", xlab = "lnRR", angle = 0) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals 
  xlim(-2,4.5) +
  geom_point(aes(fill = name),  size = 4, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling +
  scale_colour_manual(values = c("#00AEEF","#00A651","#ED1C24"))+ # change colours
  scale_fill_manual(values=c("#00AEEF","#00A651","#ED1C24"))+
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

orchard1

‘Pairwise’ effect sizes

Enrichment relative to control

VCV_E20 <- impute_covariance_matrix(vi = dat$lnRRV_E2, cluster = dat$Study_ID, r = 0.5)

mod_E20 <- rma.mv(yi = lnRR_E2a, V = VCV_E20, random = list(~1|Study_ID,
                                                             ~ 1|Strain,
                                                             ~1|ES_ID),
                 test = "t", 
                 data = dat, 
                 control=list(optimizer="optim", optmethod="Nelder-Mead"))

summary(mod_E20) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -7.3235   14.6470   22.6470   32.6904   23.1121   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0037  0.0611     30     no  Study_ID 
## sigma^2.2  0.0000  0.0000      6     no    Strain 
## sigma^2.3  0.0281  0.1675     92     no     ES_ID 
## 
## Test for Heterogeneity:
## Q(df = 91) = 475.8327, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.1066  0.0291  3.6655  91  0.0004  0.0489  0.1644  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_E20) 
##     I2_total  I2_Study_ID    I2_Strain     I2_ES_ID 
## 8.610789e-01 1.011724e-01 2.607945e-09 7.599065e-01
orchard_plot(mod_E20, mod = "Int", xlab = "lnRR")

Stress relative to control

VCV_S20 <- impute_covariance_matrix(vi = dat$lnRRV_S2, cluster = dat$Study_ID, r = 0.5)

mod_S20 <- rma.mv(yi = lnRR_S2a, V = VCV_S20, random = list(~1|Study_ID, 
                                                             ~ 1|Strain,
                                                             ~1|ES_ID),
                 test = "t",
                 data = dat)

summary(mod_S20) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -52.3561  104.7122  112.7122  122.7557  113.1773   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0323  0.1797     30     no  Study_ID 
## sigma^2.2  0.0000  0.0000      6     no    Strain 
## sigma^2.3  0.0798  0.2824     92     no     ES_ID 
## 
## Test for Heterogeneity:
## Q(df = 91) = 1003.0694, p-val < .0001
## 
## Model Results:
## 
## estimate      se     tval  df    pval    ci.lb    ci.ub 
##  -0.1846  0.0522  -3.5360  91  0.0006  -0.2882  -0.0809  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_S20) 
##     I2_total  I2_Study_ID    I2_Strain     I2_ES_ID 
## 9.489604e-01 2.734220e-01 9.879730e-10 6.755384e-01
orchard_plot(mod_S20, mod = "Int", xlab = "lnRR")

Enrichment + stress relative to control

VCV_ES20 <- impute_covariance_matrix(vi = dat$lnRRV_ES2, cluster = dat$Study_ID, r = 0.5)

mod_ES20 <- rma.mv(yi = lnRR_ES2a, V = VCV_ES20, random = list(~1|Study_ID,
                                                                ~ 1|Strain,
                                                                ~1|ES_ID),
                 test = "t",
                 data = dat)
summary(mod_ES20) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -10.3625   20.7250   28.7250   38.7684   29.1901   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0039  0.0625     30     no  Study_ID 
## sigma^2.2  0.0014  0.0377      6     no    Strain 
## sigma^2.3  0.0227  0.1508     92     no     ES_ID 
## 
## Test for Heterogeneity:
## Q(df = 91) = 402.2656, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.0801  0.0389  2.0594  91  0.0423  0.0028  0.1573  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_ES20) 
##    I2_total I2_Study_ID   I2_Strain    I2_ES_ID 
##  0.81513970  0.11355557  0.04132363  0.66026050
orchard_plot(mod_ES20, mod = "Int", xlab = "lnRR")

Enrichment + stress relative to stress

VCV_E30 <- impute_covariance_matrix(vi = dat$lnRRV_E3, cluster = dat$Study_ID, r = 0.5)

mod_E30 <- rma.mv(yi = lnRR_E3a, V = VCV_E30, random = list(~1|Study_ID,
                                                             ~ 1|Strain,
                                                             ~1|ES_ID),
                  test = "t",
                  data = dat)
summary(mod_E30) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -46.3447   92.6895  100.6895  110.7329  101.1546   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0235  0.1532     30     no  Study_ID 
## sigma^2.2  0.0263  0.1623      6     no    Strain 
## sigma^2.3  0.0543  0.2331     92     no     ES_ID 
## 
## Test for Heterogeneity:
## Q(df = 91) = 790.0249, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.2465  0.1011  2.4389  91  0.0167  0.0457  0.4472  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_E30) 
##    I2_total I2_Study_ID   I2_Strain    I2_ES_ID 
##   0.9456920   0.2132063   0.2391809   0.4933048
orchard_plot(mod_E30, mod = "Int", xlab = "lnRR")

Enrichment + stress relative to enrichment

VCV_S30 <- impute_covariance_matrix(vi = dat$lnRRV_S3, cluster = dat$Study_ID, r = 0.5)

mod_S30 <- rma.mv(yi = lnRR_S3a, V = VCV_S30, random = list(~1|Study_ID,
                                                             ~ 1|Strain,
                                                             ~1|ES_ID),
                  test = "t",
                  data = dat,
                   control=list(optimizer="optim", optmethod="Nelder-Mead"))
summary(mod_S30) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -6.8788   13.7576   21.7576   31.8011   22.2228   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0000  0.0000     30     no  Study_ID 
## sigma^2.2  0.0009  0.0292      6     no    Strain 
## sigma^2.3  0.0276  0.1662     92     no     ES_ID 
## 
## Test for Heterogeneity:
## Q(df = 91) = 540.3522, p-val < .0001
## 
## Model Results:
## 
## estimate      se     tval  df    pval    ci.lb   ci.ub 
##  -0.0087  0.0342  -0.2552  91  0.7992  -0.0766  0.0592    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_S30) 
##     I2_total  I2_Study_ID    I2_Strain     I2_ES_ID 
## 8.415428e-01 5.192043e-09 2.515933e-02 8.163835e-01
orchard_plot(mod_S30, mod = "Int", xlab = "lnRR")

mod_list2 <- list(mod_S30, mod_E30, mod_ES20, mod_S20, mod_E20) #rearranged the order so that it matches intext results

mod_res2 <- lapply(mod_list2, function(x) mod_results(x, mod = "Int"))

merged2 <- submerge(mod_res2[[1]], mod_res2[[2]],  mod_res2[[3]], mod_res2[[4]],  mod_res2[[5]], mix = T)

merged2$mod_table$name <- factor(merged2$mod_table$name, levels = c("Intrcpt1", 
    "Intrcpt2", "Intrcpt3", "Intrcpt4", "Intrcpt5"), 
    labels = rev(c("EC/CC", "CS/CC", "ES/CC", "ES/CS", "ES/EC")))

merged2$data$moderator <- factor(merged2$data$moderator, levels = c("Intrcpt1", 
    "Intrcpt2", "Intrcpt3", "Intrcpt4", "Intrcpt5"), 
    labels = rev(c("EC/CC", "CS/CC", "ES/CC", "ES/CS", "ES/EC")))

orchard2 <- orchard_plot(merged2, mod = "Int", xlab = "lnRR", angle = 0) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals 
  xlim(-2,4.5) +
  geom_point(aes(fill = name),  size = 4, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  scale_colour_manual(values = c("#7B81BE","#D7DF23","#F37158","#75CBF2","#97D2B4"))+ # change colours
  scale_fill_manual(values=c("#7B81BE","#D7DF23","#F37158","#75CBF2","#97D2B4"))+
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Figures

Panel of ‘focal’ ES and ‘pairwise’ ES orchard plots

p1 <- orchard1 + orchard2 +  plot_annotation(tag_levels = 'A')
p1

#saved as PDF: 6 x 15 inches

Panel of meta-regressions

Environmental enrichment

#Enrichment
E_mod <- (LvsM_E + Learning_E + Reinforcement_E)/ (Age_E + Exercise_E + Social_E) +  plot_annotation(tag_levels = 'A')

E_mod

#saved as pdf 10 x 15 inches

Stress

S_mod <- (LvsM_S + Learning_S + Reinforcement_S) / (Age_S + Stressor + Duration_S) + plot_annotation(tag_levels = 'A')

S_mod

#saved as pdf 10 x 15 inches

Interaction

ES_mod <- plot_grid(LvsM_ES, Learning_ES, Reinforcement_ES, Age_enrichment_ES, Age_stress_ES, Order_ES, Exercise_ES, Social_ES, Stressor_ES, Duration_ES,
  labels = "AUTO", ncol = 5)

ES_mod

#saved as 10 x 20 inches

Panel of funnel plots

# EE

pdf(NULL)
dev.control(displaylist="enable")
par(mar=c(4,4,0.1,0))
A <- funnel(mod_Sfm, xlab = "Residuals (lnRR)", ylab = "Standard Error",
        xlim = c(-2,2),
        ylim = c(0,1.05))
A <- recordPlot()
invisible(dev.off())

# Stress

pdf(NULL)
dev.control(displaylist="enable")
par(mar=c(4,4,0.1,0))
B <- funnel(mod_Sfm, xlab = "Residuals (lnRR)", ylab = "Standard Error",
        xlim = c(-2,2),
        ylim = c(0,1.05))
B <- recordPlot()
invisible(dev.off())

# Interaction
pdf(NULL)
dev.control(displaylist="enable")
par(mar=c(4,4,0.1,0))
C <- funnel(mod_ESfm, xlab = "Residuals (lnRR)", ylab = "Standard Error",
        xlim = c(-2,2),
        ylim = c(0,1.05))
C <- recordPlot()
invisible(dev.off())

# putting together
ggdraw(A) + ggdraw(B) + ggdraw(C) + plot_annotation(tag_levels = 'A')

#png(file = here("figs", "Fig7_Funnels.png"))
 
#dev.off()
knitr::include_graphics(here("figs", "funnels.png"))

Modelling with SMD

Models are of the three ‘focal’ models

Environmental Enrichment

mod_E0a <- rma.mv(yi = SMD_Ea, V = VCV_Ea, random = list(~1|Study_ID,
                                                         ~1|ES_ID, 
                                                         ~1|Strain),
                 test = "t",
                 data = dat)
summary(mod_E0a)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##    logLik   Deviance        AIC        BIC       AICc 
## -111.6284   223.2568   231.2568   241.3003   231.7220   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.2512  0.5012     30     no  Study_ID 
## sigma^2.2  0.4247  0.6517     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Heterogeneity:
## Q(df = 91) = 673.4722, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.7241  0.1295  5.5895  91  <.0001  0.4668  0.9814  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_E0a)
##     I2_total  I2_Study_ID     I2_ES_ID    I2_Strain 
## 8.673320e-01 3.223202e-01 5.450118e-01 1.749563e-09

Stress

mod_S0a <- rma.mv(yi = SMD_Sa, V = VCV_Sa, random = list(~1|Study_ID,
                                                         ~1|ES_ID,
                                                         ~1|Strain),
                test = "t",
                data = dat)
summary(mod_S0a) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##    logLik   Deviance        AIC        BIC       AICc 
## -120.2817   240.5634   248.5634   258.6068   249.0285   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.3874  0.6224     30     no  Study_ID 
## sigma^2.2  0.4969  0.7049     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Heterogeneity:
## Q(df = 91) = 818.5592, p-val < .0001
## 
## Model Results:
## 
## estimate      se     tval  df    pval    ci.lb    ci.ub 
##  -0.4256  0.1498  -2.8403  91  0.0056  -0.7232  -0.1279  ** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_S0a) 
##     I2_total  I2_Study_ID     I2_ES_ID    I2_Strain 
## 8.959540e-01 3.924790e-01 5.034750e-01 1.438454e-09

Interaction

mod_ES0a <- rma.mv(yi = SMD_ESa, V = VCV_ESa, random = list(~1|Study_ID,
                                                            ~1|ES_ID,
                                                            ~1|Strain),
                  test = "t",
                  data = dat)
summary(mod_ES0a)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##    logLik   Deviance        AIC        BIC       AICc 
## -126.0571   252.1141   260.1141   270.1576   260.5793   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.4653  0.6821     30     no  Study_ID 
## sigma^2.2  0.3698  0.6081     92     no     ES_ID 
## sigma^2.3  0.0000  0.0002      6     no    Strain 
## 
## Test for Heterogeneity:
## Q(df = 91) = 257.4673, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.6880  0.1763  3.9017  91  0.0002  0.3377  1.0382  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_ES0a) 
##     I2_total  I2_Study_ID     I2_ES_ID    I2_Strain 
## 6.657130e-01 3.709364e-01 2.947766e-01 3.351907e-08

Risk of Bias

Percent of studies that used randomisation and used blinding

# randomisation
dat %>% group_by(ROB_randomisation) %>% 
  summarise(n = n_distinct(Study_ID))
## # A tibble: 2 x 2
##   ROB_randomisation     n
##   <chr>             <int>
## 1 Unclear              15
## 2 Yes                  15
15/30
## [1] 0.5
#blinding
dat %>% group_by(ROB_blinding) %>% 
  summarise(n = n_distinct(Study_ID))
## # A tibble: 2 x 2
##   ROB_blinding     n
##   <chr>        <int>
## 1 Unclear         24
## 2 Yes              6
6/30
## [1] 0.2

Software and package versions

sessionInfo() %>% pander()

R version 4.1.0 (2021-05-18)

Platform: x86_64-apple-darwin17.0 (64-bit)

locale: en_AU.UTF-8||en_AU.UTF-8||en_AU.UTF-8||C||en_AU.UTF-8||en_AU.UTF-8

attached base packages: grid, stats, graphics, grDevices, utils, datasets, methods and base

other attached packages: pander(v.0.6.4), gridGraphics(v.0.5-1), png(v.0.1-7), cowplot(v.1.1.1), ggthemr(v.1.1.0), ggalluvial(v.0.12.3), visdat(v.0.5.3), networkD3(v.0.4), GoodmanKruskal(v.0.0.3), patchwork(v.1.1.1), MuMIn(v.1.43.17), orchaRd(v.0.0.0.9000), clubSandwich(v.0.5.3), metafor(v.3.0-2), Matrix(v.1.3-3), here(v.1.0.1), forcats(v.0.5.1), stringr(v.1.4.0), dplyr(v.1.0.6), purrr(v.0.3.4), readr(v.1.4.0), tidyr(v.1.1.3), tibble(v.3.1.2), ggplot2(v.3.3.3) and tidyverse(v.1.3.1)

loaded via a namespace (and not attached): nlme(v.3.1-152), fs(v.1.5.0), lubridate(v.1.7.10), httr(v.1.4.2), rprojroot(v.2.0.2), tools(v.4.1.0), backports(v.1.2.1), utf8(v.1.2.1), R6(v.2.5.0), DBI(v.1.1.1), colorspace(v.2.0-1), withr(v.2.4.2), tidyselect(v.1.1.1), compiler(v.4.1.0), cli(v.2.5.0), rvest(v.1.0.0), pacman(v.0.5.1), xml2(v.1.3.2), sandwich(v.3.0-1), bookdown(v.0.22), scales(v.1.1.1), digest(v.0.6.27), rmarkdown(v.2.8), pkgconfig(v.2.0.3), htmltools(v.0.5.1.1), highr(v.0.9), dbplyr(v.2.1.1), htmlwidgets(v.1.5.3), rlang(v.0.4.11), readxl(v.1.3.1), rstudioapi(v.0.13), generics(v.0.1.0), zoo(v.1.8-9), jsonlite(v.1.7.2), magrittr(v.2.0.1), Rcpp(v.1.0.6), munsell(v.0.5.0), fansi(v.0.4.2), lifecycle(v.1.0.0), stringi(v.1.6.2), yaml(v.2.2.1), mathjaxr(v.1.4-0), crayon(v.1.4.1), lattice(v.0.20-44), haven(v.2.4.1), hms(v.1.1.0), knitr(v.1.33), pillar(v.1.6.1), igraph(v.1.2.6), codetools(v.0.2-18), stats4(v.4.1.0), reprex(v.2.0.0), glue(v.1.4.2), evaluate(v.0.14), modelr(v.0.1.8), vctrs(v.0.3.8), rmdformats(v.1.0.2), cellranger(v.1.1.0), gtable(v.0.3.0), assertthat(v.0.2.1), xfun(v.0.23), broom(v.0.7.6) and ellipsis(v.0.3.2)

LS0tCnRpdGxlOiAiRW5yaWNobWVudCB4IHN0cmVzcyBNQSIKYXV0aG9yczogIkVyaW4gTCBNYWNhcnRuZXksIE1hbGdvcnphdGEgTGFnaXN6LCBTaGluaWNoaSBOYWthZ2F3YSIKc3VidGl0bGU6IFN1cHBsZW1lbnRhcnkgTWF0ZXJpYWwKb3V0cHV0OiAKICAgIAogICAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246CiAgICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQogICMgb3V0cHV0OgojICAgaHRtbF9kb2N1bWVudDoKIyAgICAgY29kZV9mb2xkaW5nOiBoaWRlCiMgICAgIGRmX3ByaW50OiBrYWJsZQojICAgICB0b2M6IFRSVUUKIyAgICAgdG9jX2Zsb2F0OiBUUlVFCiMgICAgIHRvY19kZXB0aDogNAojICAgICBjb2xsYXBzZWQ6IEZBTFNFCiMgICAgIFlBTUw6IHJtZGZvcm1hdHM6OnJvYm9ib29rCi0tLQoKYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KAptZXNzYWdlID0gRkFMU0UsCndhcm5pbmcgPSBGQUxTRSwKY2FjaGUgPSBUUlVFLCAKdGlkeSA9IFRSVUUsIAplY2hvID0gVFJVRQopCgpybShsaXN0ID0gbHMoKSkKYGBgCgojIFNldHRpbmctdXAgey50YWJzZXR9CgojIyBMb2FkaW5nIHBhY2thZ2VzCgpgYGB7cn0KCiNkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoJ01pa2F0YS1Qcm9qZWN0L2dndGhlbXInLCBmb3JjZSA9IFRSVUUpIAoKcGFjbWFuOjpwX2xvYWQodGlkeXZlcnNlLCAKICAgICAgICAgICAgICAgaGVyZSwKICAgICAgICAgICAgICAgbWV0YWZvciwKICAgICAgICAgICAgICAgY2x1YlNhbmR3aWNoLAogICAgICAgICAgICAgICBvcmNoYVJkLCAKICAgICAgICAgICAgICAgTXVNSW4sCiAgICAgICAgICAgICAgIHBhdGNod29yaywKICAgICAgICAgICAgICAgR29vZG1hbktydXNrYWwsCiAgICAgICAgICAgICAgIG5ldHdvcmtEMywKICAgICAgICAgICAgICAgZ2dwbG90MiwKICAgICAgICAgICAgICAgdmlzZGF0LAogICAgICAgICAgICAgICBnZ2FsbHV2aWFsLAogICAgICAgICAgICAgICBnZ3RoZW1yLCAKICAgICAgICAgICAgICAgY293cGxvdCwKICAgICAgICAgICAgICAgZ3JEZXZpY2VzLAogICAgICAgICAgICAgICBwbmcsCiAgICAgICAgICAgICAgIGdyaWQsCiAgICAgICAgICAgICAgIGdyaWRHcmFwaGljcywKICAgICAgICAgICAgICAgcGFuZGVyKQojIG5lZWRlZCBmb3IgbW9kZWwgc2VsZWN0aW9uIHVzaW5nIE11TUluIHdpdGhpbiBtZXRhZm9yCmV2YWwobWV0YWZvcjo6Oi5NdU1JbikKCmBgYAoKIyMgTG9hZGluZyBkYXRhIGFuZCBmdW5jdGlvbnMKVGhpcyBsb2FkcyB0aGUgdW5wcm9jZXNzZWQgZGF0YWZpbGUgYW5kIGN1c3RvbSBmdW5jdGlvbnMgaW5jbHVkaW5nOiAKKmNhbGN1bGF0aW5nICdmb2NhbCcgYW5kICdwYWlyLXdpc2UnIGVmZmVjdCBzaXplcyBhbmQgdmFyaWFuY2UKKmNhbGN1bGF0aW5nIFNNRAoqY3JlYXRpbmcgVkNWIG9mIHZhcmlhbmNlCgpgYGB7cn0KZGF0IDwtIHJlYWRfY3N2KGhlcmUoIkRhdGEiLCJEYXRhX3Jhdy5jc3YiKSkKIyBMb2FkIGN1c3RvbSBmdW5jdGlvbiB0byBleHRyYWN0IGRhdGEgCnNvdXJjZShoZXJlKCJSL0Z1bmN0aW9ucy5SIikpIApgYGAKCiMjIERhdGEgb3JnYW5pc2F0aW9uCipyZW1vdmluZyBzdHVkeSAoV2FuZyBldCBhbF8yMDIwKSB3aXRoIG5lZ2F0aXZlIHZhbHVlcyBhcyBsblJSIGNhbm5vdCBiZSBjYWxjdWxhdGVkIHdpdGggbmVnYXRpdmUgdmFsdWVzCipyb3VuZGluZyBkb3duIHNhbXBsZSBzaXplcyB0aGF0IGFyZSByZXBvcnRlZCBhcyBkZWNpbWFscyBkdWUgdG8gYXZlcmFnaW5nIG4gYWNyb3NzIHRyZWF0bWVudHMgKHJvdW5kaW5nIGRvd24gaXMgbW9yZSBjb25zZXJ2YXRpdmUpLAoqZ2V0dGluZyBlZmZlY3Qgc2l6ZXMgZnJvbSBmdW5jdGlvbgoqJ2ZsaXBwaW5nJyBlZmZlY3Qgc2l6ZXMgc28gdGhhdCBhbGwgZWZmZWN0IHNpemVzIGFyZSBoaWdoZXIgdmFsdWVzID0gaW5kaXZpZHVhbHMgZG8gYmV0dGVyIGFuZCBsZWFybmluZy9tZW1vcnkKKmFzc2lnbmluZyBodW1hbiByZWFkYWJsZSB0ZXJtcywgYW5kIGNyZWF0aW5nIFZDViBvZiB2YXJpYW5jZSAKCmBgYHtyfQoKIyByZW1vdmluZyBzdHVkeSB3aXRoIG5lZ2F0aXZlIHZhbHVlcyBhcyB0aGVzZSBhcmUgdW5hYmxlIHRvIGJlIHVzZWQgZm9yIGxuUlIKZGF0IDwtIGRyb3BsZXZlbHMoZGF0WyFkYXQkRmlyc3RfYXV0aG9yID09ICdXYW5nJyxdKQoKI3JvdW5kaW5nIGRvd24gc2FtcGxlIHNpemVzCmRhdCRDQ19uIDwtIGZsb29yKGRhdCRDQ19uKQpkYXQkRUNfbiA8LSBmbG9vcihkYXQkRUNfbikKZGF0JENTX24gPC0gZmxvb3IoZGF0JENTX24pCmRhdCRFU19uIDwtIGZsb29yKGRhdCRDU19uKQoKIyAnRm9jYWwnIGVmZmVjdF9zaXplIAplZmZlY3Rfc2l6ZSA8LSB3aXRoKGRhdCwgbWFwcGx5KGVmZmVjdF9zZXQsIAogICAgICAgICAgICAgICAgICAgICAgQ0NfbiAsCiAgICAgICAgICAgICAgICAgICAgICBDQ19tZWFuLCAKICAgICAgICAgICAgICAgICAgICAgIENDX1NELAogICAgICAgICAgICAgICAgICAgICAgRUNfbiwgCiAgICAgICAgICAgICAgICAgICAgICBFQ19tZWFuLCAKICAgICAgICAgICAgICAgICAgICAgIEVDX1NELAogICAgICAgICAgICAgICAgICAgICAgQ1NfbiwgCiAgICAgICAgICAgICAgICAgICAgICBDU19tZWFuLCAKICAgICAgICAgICAgICAgICAgICAgIENTX1NELAogICAgICAgICAgICAgICAgICAgICAgRVNfbiwgCiAgICAgICAgICAgICAgICAgICAgICBFU19tZWFuLCAKICAgICAgICAgICAgICAgICAgICAgIEVTX1NELAogICAgICAgICAgICAgICAgICAgICAgcGVyY2VudCA9IFJlc3BvbnNlX3BlcmNlbnQsCiAgICAgICAgICAgICAgICAgICAgICBTSU1QTElGWSA9IEZBTFNFKSkKZWZmZWN0X3NpemUgPC0gbWFwX2RmcihlZmZlY3Rfc2l6ZSwgSSkKCiMgJ1BhaXJ3aXNlJyBlZmZlY3Qgc2l6ZQogZWZmZWN0X3NpemUyIDwtIHdpdGgoZGF0LCBtYXBwbHkoZWZmZWN0X3NldDIsIAogICAgICAgICAgICAgICAgICAgICAgQ0NfbiAsCiAgICAgICAgICAgICAgICAgICAgICBDQ19tZWFuLCAKICAgICAgICAgICAgICAgICAgICAgIENDX1NELAogICAgICAgICAgICAgICAgICAgICAgRUNfbiwgCiAgICAgICAgICAgICAgICAgICAgICBFQ19tZWFuLCAKICAgICAgICAgICAgICAgICAgICAgIEVDX1NELAogICAgICAgICAgICAgICAgICAgICAgQ1NfbiwgCiAgICAgICAgICAgICAgICAgICAgICBDU19tZWFuLCAKICAgICAgICAgICAgICAgICAgICAgIENTX1NELAogICAgICAgICAgICAgICAgICAgICAgRVNfbiwgCiAgICAgICAgICAgICAgICAgICAgICBFU19tZWFuLCAKICAgICAgICAgICAgICAgICAgICAgIEVTX1NELAogICAgICAgICAgICAgICAgICAgICAgcGVyY2VudCA9IFJlc3BvbnNlX3BlcmNlbnQsCiAgICAgICAgICAgICAgICAgICAgICBTSU1QTElGWSA9IEZBTFNFKSkKZWZmZWN0X3NpemUyIDwtIG1hcF9kZnIoZWZmZWN0X3NpemUyLCBJKQoKZnVsbF9pbmZvIDwtIHdoaWNoKGNvbXBsZXRlLmNhc2VzKGVmZmVjdF9zaXplKSA9PSBUUlVFKQoKIyBhZGRpbmcgZWZmZWN0IHNpemVzIGFzIGNvbHVtbgpkYXQgPC0gYmluZF9jb2xzKGRhdCwgZWZmZWN0X3NpemUsIGVmZmVjdF9zaXplMikKZGF0IDwtIGRhdFtmdWxsX2luZm8sIF0KCiNGbGlwcGluZyAnbG93ZXIgaXMgYmV0dGVyJyB0byAnaGlnaGVyIGlzIGJldHRlcicgZWZmZWN0IHNpemVzCiNmbGlwcGluZyBsblJSIGZvciB2YWx1ZXMgd2hlcmUgaGlnaGVyID0gd29yc2UKZGF0JGxuUlJfRWEgPC0gaWZlbHNlKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24gPT0gMiwgZGF0JGxuUlJfRSotMSxpZmVsc2UoaXMubmEoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbikgPT0gVFJVRSwgTkEsIGRhdCRsblJSX0UpKQojIGN1cnJlbnRseSBOQXN3aGljaCBjYXVzZXMgZXJyb3IKZGF0JGxuUlJfU2EgIDwtIGlmZWxzZShkYXQkUmVzcG9uc2VfZGlyZWN0aW9uID09IDIsIGRhdCRsblJSX1MqLTEsaWZlbHNlKGlzLm5hKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24pID09IFRSVUUsIE5BLCBkYXQkbG5SUl9TKSkgIyBjdXJyZW50bHkgTkFzd2hpY2ggY2F1c2VzIGVycm9yCmRhdCRsblJSX0VTYSA8LSAgaWZlbHNlKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24gPT0gMiwgZGF0JGxuUlJfRVMqLTEsaWZlbHNlKGlzLm5hKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24pID09IFRSVUUsIE5BLCBkYXQkbG5SUl9FUykpICMgY3VycmVudGx5IE5Bc3doaWNoIGNhdXNlcyBlcnJvcgojZmxpcHBpbmcgJ3B1cmUgZWZmZWN0IHNpemVzJwpkYXQkbG5SUl9FMmEgPC0gaWZlbHNlKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24gPT0gMiwgZGF0JGxuUlJfRTIqLTEsaWZlbHNlKGlzLm5hKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24pID09IFRSVUUsIE5BLCBkYXQkbG5SUl9FMikpICMgY3VycmVudGx5IE5Bc3doaWNoIGNhdXNlcyBlcnJvcgpkYXQkbG5SUl9TMmEgIDwtIGlmZWxzZShkYXQkUmVzcG9uc2VfZGlyZWN0aW9uID09IDIsIGRhdCRsblJSX1MyKi0xLGlmZWxzZShpcy5uYShkYXQkUmVzcG9uc2VfZGlyZWN0aW9uKSA9PSBUUlVFLCBOQSwgZGF0JGxuUlJfUzIpKSAjIGN1cnJlbnRseSBOQXN3aGljaCBjYXVzZXMgZXJyb3IKZGF0JGxuUlJfRVMyYSA8LSAgaWZlbHNlKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24gPT0gMiwgZGF0JGxuUlJfRVMyKi0xLGlmZWxzZShpcy5uYShkYXQkUmVzcG9uc2VfZGlyZWN0aW9uKSA9PSBUUlVFLCBOQSwgZGF0JGxuUlJfRVMyKSkgIyBjdXJyZW50bHkgTkFzd2hpY2ggY2F1c2VzIGVycm9yCmRhdCRsblJSX0UzYSA8LSAgaWZlbHNlKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24gPT0gMiwgZGF0JGxuUlJfRTMqLTEsaWZlbHNlKGlzLm5hKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24pID09IFRSVUUsIE5BLCBkYXQkbG5SUl9FMykpICMgY3VycmVudGx5IE5Bc3doaWNoIGNhdXNlcyBlcnJvcgpkYXQkbG5SUl9TM2EgPC0gIGlmZWxzZShkYXQkUmVzcG9uc2VfZGlyZWN0aW9uID09IDIsIGRhdCRsblJSX1MzKi0xLGlmZWxzZShpcy5uYShkYXQkUmVzcG9uc2VfZGlyZWN0aW9uKSA9PSBUUlVFLCBOQSwgZGF0JGxuUlJfUzMpKSAjIGN1cnJlbnRseSBOQXN3aGljaCBjYXVzZXMgZXJyb3IKCiNmbGlwcGluZyBTTUQKZGF0JFNNRF9FYSA8LSBpZmVsc2UoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbiA9PSAyLCBkYXQkU01EX0UqLTEsaWZlbHNlKGlzLm5hKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24pID09IFRSVUUsIE5BLCBkYXQkU01EX0UpKSAjIGN1cnJlbnRseSBOQXN3aGljaCBjYXVzZXMgZXJyb3IKZGF0JFNNRF9TYSAgPC0gaWZlbHNlKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24gPT0gMiwgZGF0JFNNRF9TKi0xLGlmZWxzZShpcy5uYShkYXQkUmVzcG9uc2VfZGlyZWN0aW9uKSA9PSBUUlVFLCBOQSwgZGF0JFNNRF9TKSkgIyBjdXJyZW50bHkgTkFzd2hpY2ggY2F1c2VzIGVycm9yCmRhdCRTTURfRVNhIDwtICBpZmVsc2UoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbiA9PSAyLCBkYXQkU01EX0VTKi0xLGlmZWxzZShpcy5uYShkYXQkUmVzcG9uc2VfZGlyZWN0aW9uKSA9PSBUUlVFLCBOQSwgZGF0JFNNRF9FUykpCgojIGFzc2lnbmluZyBodW1hbiByZWFkYWJsZSB0ZXJtcwpkYXQgPC0gZGF0ICU+JSBtdXRhdGUoVHlwZV9hc3NheSA9IGNhc2Vfd2hlbihUeXBlX2Fzc2F5ID09IDEgfiAiSGFiaXR1YXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX2Fzc2F5ID09IDIgfiAiQ29uZGl0aW9uaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9hc3NheSA9PSAzIH4gIlJlY29nbml0aW9uIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfYXNzYXkgPT0gNCB+ICJVbmNsZWFyIiksCiAgICAgICAgICAgICAgICAgICAgICBMZWFybmluZ192c19tZW1vcnkgPSBjYXNlX3doZW4oTGVhcm5pbmdfdnNfbWVtb3J5ID09IDEgfiAiTGVhcm5pbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlYXJuaW5nX3ZzX21lbW9yeSA9PSAyIH4gIk1lbW9yeSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlYXJuaW5nX3ZzX21lbW9yeSA9PSAzIH4gIkhhYml0dWF0aW9uIiksCiAgICAgICAgICAgICAgICAgICAgICBUeXBlX3JlaW5mb3JjZW1lbnQgPSBjYXNlX3doZW4oVHlwZV9yZWluZm9yY2VtZW50PT0gMSB+IkFwcGV0aXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX3JlaW5mb3JjZW1lbnQ9PSAyIH4gIkF2ZXJzaXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9yZWluZm9yY2VtZW50PT0gMyB+ICJOb3QgYXBwbGljYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfcmVpbmZvcmNlbWVudD09IDQgfiAiVW5jbGVhciIpLAogICAgICAgICAgICAgICAgICAgICAgVHlwZV9zdHJlc3NfZXhwb3N1cmUgPSBjYXNlX3doZW4oVHlwZV9zdHJlc3NfZXhwb3N1cmUgPT0gMSB+ICJEZW5zaXR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfc3RyZXNzX2V4cG9zdXJlID09IDIgfiAiU2NlbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9zdHJlc3NfZXhwb3N1cmUgPT0gMyB+ICJTaG9jayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX3N0cmVzc19leHBvc3VyZSA9PSA0IH4gIkV4ZXJ0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfc3RyZXNzX2V4cG9zdXJlID09IDUgfiAiUmVzdHJhaW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfc3RyZXNzX2V4cG9zdXJlID09IDYgfiAiTVMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9zdHJlc3NfZXhwb3N1cmUgPT0gNyB+ICJDaXJjYWRpYW4gcmh5dGhtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfc3RyZXNzX2V4cG9zdXJlID09IDggfiAiTm9pc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9zdHJlc3NfZXhwb3N1cmUgPT0gOSB+ICJPdGhlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX3N0cmVzc19leHBvc3VyZSA9PSAxMCB+ICJDb21iaW5hdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX3N0cmVzc19leHBvc3VyZSA9PSAxMSB+ICJ1bmNsZWFyIiksIAogICAgICAgICAgICAgICAgICAgICAgQWdlX3N0cmVzc19leHBvc3VyZSA9IGNhc2Vfd2hlbihBZ2Vfc3RyZXNzX2V4cG9zdXJlID09IDEgfiAiUHJlbmF0YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2Vfc3RyZXNzX2V4cG9zdXJlID09IDIgfiAiRWFybHkgcG9zdG5hdGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdlX3N0cmVzc19leHBvc3VyZSA9PSAzIH4gIkFkb2xlc2NlbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2Vfc3RyZXNzX2V4cG9zdXJlID09IDQgfiAiQWR1bHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2Vfc3RyZXNzX2V4cG9zdXJlID09IDUgfiAiVW5jbGVhciIpLAogICAgICAgICAgICAgICAgICAgICAgU3RyZXNzX2R1cmF0aW9uID0gY2FzZV93aGVuKFN0cmVzc19kdXJhdGlvbiA9PSAxIH4gIkFjdXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlc3NfZHVyYXRpb24gPT0gMiB+ICJDaHJvbmljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlc3NfZHVyYXRpb24gPT0gMyB+ICJJbnRlcm1pdHRlbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVzc19kdXJhdGlvbiA9PSA0IH4gIlVuY2xlYXIiKSwKICAgICAgICAgICAgICAgICAgICAgIEVFX3NvY2lhbCA9IGNhc2Vfd2hlbihFRV9zb2NpYWwgPT0gMSB+ICJTb2NpYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVFX3NvY2lhbD09IDIgfiAiTm9uLXNvY2lhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVFX3NvY2lhbCA9PSAzIH4gIlVuY2xlYXIiKSwgCiAgICAgICAgICAgICAgICAgICAgICBFRV9leGVyY2lzZSA9IGNhc2Vfd2hlbihFRV9leGVyY2lzZSA9PSAxIH4gIkV4ZXJjaXNlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRV9leGVyY2lzZSA9PSAyIH4gIk5vIGV4ZXJjaXNlIiksCiAgICAgICAgICAgICAgICAgICAgICBBZ2VfRUVfZXhwb3N1cmUgPSBjYXNlX3doZW4oQWdlX0VFX2V4cG9zdXJlID09IDEgfiAiUHJlbmF0YWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2VfRUVfZXhwb3N1cmUgPT0gMiB+ICJFYXJseSBwb3N0bmF0YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZV9FRV9leHBvc3VyZSA9PSAzIH4gIkFkb2xlc2NlbnQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2VfRUVfZXhwb3N1cmUgPT0gNCB+ICJBZHVsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdlX0VFX2V4cG9zdXJlID09IDUgfiAiVW5jbGVhciIpLAogICAgICAgICAgICAgICAgICAgICAgRXhwb3N1cmVfb3JkZXIgPSBjYXNlX3doZW4oRXhwb3N1cmVfb3JkZXIgPT0gMSB+ICJTdHJlc3MgZmlyc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBvc3VyZV9vcmRlciA9PSAyIH4gIkVucmljaG1lbnQgZmlyc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBvc3VyZV9vcmRlciA9PSAzIH4gIkNvbmN1cnJlbnRseSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBvc3VyZV9vcmRlciA9PSA0IH4gIlVuY2xlYXIiKSwKICAgICAgICAgICAgICAgICAgICAgIEFnZV9hc3NheSA9IGNhc2Vfd2hlbihBZ2VfYXNzYXkgPT0gMSB+ICJFYXJseSBwb3N0bmF0YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZV9hc3NheSA9PSAyIH4gIkFkb2xlc2NlbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZV9hc3NheSA9PSAzIH4gIkFkdWx0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdlX2Fzc2F5ID09IDQgfiAiVW5jbGVhciIpLAogICAgICAgICAgICAgICAgICAgICAgU2V4ID0gY2FzZV93aGVuKFNleCA9PSAxIH4gIkZlbWFsZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNleCA9PSAyIH4gIk1hbGUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXggPT0gMyB+ICJNaXhlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNleCA9PSA0IH4gIlVuY2xlYXIiKSwKICAgICAgICAgICAgICAgICAgICAgIFR5cGVfRUVfZXhwb3N1cmUgPSBjYXNlX3doZW4oVHlwZV9FRV9leHBvc3VyZSA9PSAxIH4gIk5lc3RpbmcgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX0VFX2V4cG9zdXJlID09IDIgfiAiT2JqZWN0cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfRUVfZXhwb3N1cmUgPT0gMyB+ICJDYWdlIGNvbXBsZXhpdHkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9FRV9leHBvc3VyZSA9PSA0IH4gIldoZWVsL3RyYWRlbWlsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfRUVfZXhwb3N1cmUgPT0gNSB+ICJDb21iaW5hdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfRUVfZXhwb3N1cmUgPT0gNiB+ICJPdGhlciIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX0VFX2V4cG9zdXJlID09IDcgfiAiVW5jbGVhciIpLAogICAgICAgICAgICAgICAgICAgICAgUk9CX2JsaW5kaW5nID0gY2FzZV93aGVuKFJPQl9ibGluZGluZyA9PSAxIH4gIlllcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9CX2JsaW5kaW5nID09IDIgfiAiTm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJPQl9ibGluZGluZyA9PSAzIH4gIlVuY2xlYXIiKSwKICAgICAgICAgICAgICAgICAgICAgIFJPQl9yYW5kb21pc2F0aW9uID0gY2FzZV93aGVuKFJPQl9yYW5kb21pc2F0aW9uID09IDEgfiAiWWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJPQl9yYW5kb21pc2F0aW9uID09IDIgfiAiTm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9CX3JhbmRvbWlzYXRpb24gPT0gMyB+ICJVbmNsZWFyIikpCgojbWFraW5nIHZhcmlhbmNlIFZDVnMKVkNWX0UgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0JGxuUlJWX0UsIGNsdXN0ZXIgPSBkYXQkU3R1ZHlfSUQsIHIgPSAwLjUpClZDVl9TIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdCRsblJSVl9TLCBjbHVzdGVyID0gZGF0JFN0dWR5X0lELCByID0gMC41KQpWQ1ZfRVMgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0JGxuUlJWX0VTLCBjbHVzdGVyID0gZGF0JFN0dWR5X0lELCByID0gMC41KQoKVkNWX0VhIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdCRTTURWX0UsIGNsdXN0ZXIgPSBkYXQkU3R1ZHlfSUQsIHIgPSAwLjUpClZDVl9TYSA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQkU01EVl9TLCBjbHVzdGVyID0gZGF0JFN0dWR5X0lELCByID0gMC41KQpWQ1ZfRVNhIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdCRTTURWX0VTLCBjbHVzdGVyID0gZGF0JFN0dWR5X0lELCByID0gMC41KQoKI3dyaXRlLmNzdihkYXQsIGZpbGUgPSBoZXJlKCJEYXRhIiwgJ0RhdGFfcHJvY2Vzc2VkLmNzdicpLCByb3cubmFtZXMgPSBUUlVFKQpgYGAKCiMgRGF0YSBleHBsb3JhdGlvbgoKIyMgR2VuZXJhbAoqbnVtYmVyIG9mIGVmZmVjdCBzaXplcwoqbnVtYmVyIG9mIHN0dWRpZXMKKnB1YmxpY2F0aW9uIHllYXIgcmFuZ2UKYGBgIHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZXZhbCA9IEZBTFNFfQojTnVtYmVyIG9mIGVmZmVjdCBzaXplcwpsZW5ndGgodW5pcXVlKGRhdCRFU19JRCkpICAKCiNOdW1iZXIgb2Ygc3R1ZGllcwpsZW5ndGgodW5pcXVlKGRhdCRTdHVkeV9JRCkpCgojUHVibGljYXRpb24geWVhcnMKbWluKGRhdCRZZWFyX3B1Ymxpc2hlZCkgCm1heChkYXQkWWVhcl9wdWJsaXNoZWQpCmBgYAoKIyMgVmlzdWFsIG9mIG1pc3NpbmcgZGF0YQoKYGBge3IsIHJlc3VsdHMgPSAnaGlkZSd9CgpwbG90X21pc3NpbmcgPC0gdmlzX21pc3MoZGF0KSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgdmp1c3QgPSAzKSwKICAgICAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbih0ID0gMC41LCByID0gMywgYiA9IDEsIGwgPSAxLCB1bml0ID0gImNtIikpICsKICBnZ3RpdGxlKCJNaXNzaW5nIGRhdGEgaW4gdGhlIHNlbGVjdGVkIHByZWRpY3RvcnMiKSAjbm8gbWlzc2luZyB2YWx1ZXMKCnBsb3RfbWlzc2luZwojdXNlR29vZG1hbiBhbmQgS3J1c2thbOKAmXMgz4QgbWVhc3VyZSBvZiBhc3NvY2lhdGlvbiBiZXR3ZWVuIGNhdGVnb3JpY2FsIHByZWRpY3RvciB2YXJpYWJsZXMgKGZ1bmN0aW9uIGZyb20gcGFja2FnZSBHb29kbWFuS3J1c2thbDogaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL0dvb2RtYW5LcnVza2FsL3ZpZ25ldHRlcy9Hb29kbWFuS3J1c2thbC5odG1sKQojR0ttYXRyaXggPC0gR0t0YXVEYXRhZnJhbWUoc3Vic2V0KGRhdCwgc2VsZWN0ID0gYygiU2V4IiwgIlR5cGVfYXNzYXkiLCAiTGVhcm5pbmdfdnNfbWVtb3J5IiwgIyJUeXBlX3JlaW5mb3JjZW1lbnQiLCAgIlR5cGVfc3RyZXNzX2V4cG9zdXJlIiwgIkFnZV9zdHJlc3NfZXhwb3N1cmUiLCAiU3RyZXNzX2R1cmF0aW9uIiwgIyJFRV9zb2NpYWxfSFIiLCAiRUVfZXhlcmNpc2UiLCAiQWdlX0VFX2V4cG9zdXJlIiwgIkV4cG9zdXJlX29yZGVyIiwgIkFnZV9hc3NheSIpKSkKI3Bsb3QoR0ttYXRyaXgpCgojc2ltcGxlIHBhaXJ3aXNlIGNvbnRpbmdlbmN5IHRhYmxlcwojIHRhYmxlKGRhdCRUeXBlX2Fzc2F5LCBkYXQkVHlwZV9yZWluZm9yY2VtZW50KSAKIyB0YWJsZShkYXQkQWdlX3N0cmVzc19leHBvc3VyZSwgZGF0JEFnZV9FRV9leHBvc3VyZSkgCiMgdGFibGUoZGF0JFR5cGVfc3RyZXNzX2V4cG9zdXJlLCBkYXQkQWdlX3N0cmVzc19leHBvc3VyZSkKIyB0YWJsZShkYXQkVHlwZV9zdHJlc3NfZXhwb3N1cmUsIGRhdCRBZ2VfYXNzYXkpCiMgdGFibGUoZGF0JFR5cGVfc3RyZXNzX2V4cG9zdXJlLCBkYXQkU3RyZXNzX2R1cmF0aW9uKQpgYGAKCiMjIEFsbHV2aWFsIGRpYWdyYW1zIHsudGFic2V0fQpTaG93cyB0aGUgcmVsYXRpb25zaGlwL25lc3RlZG5lc3Mgb2YgZGlmZmVyZW50IGRhdGEgZWxlbWVudHMgKHVzZWQgZm9yIHByb2R1Y2UgRmlnLiAyKQoKIyMjIFN1YmplY3RzIGluZm86IHNwZWNpZXMtc3RyYWluLXNleAoKYGBge3IsIHJlc3VsdHM9ICdoaWRlJywgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CmZyZXFfQSA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGRhdCRTZXgsIGRhdCRDb21tb25fc3BlY2llcywgZGF0JFN0cmFpbikpICU+JSByZW5hbWUoU2V4ID0gVmFyMSwgU3BlY2llcyA9IFZhcjIsIFN0cmFpbiA9IFZhcjMpICNtYWtlIGEgZGF0YSBmcmFtZSBvZiBmcmVxdWVuY2llcyBmb3IgdGhyZWUgc2VsZWN0ZWQgdmFyaWFibGVzCmlzX2FsbHV2aWFfZm9ybShhcy5kYXRhLmZyYW1lKGZyZXFfQSksIGF4ZXMgPSAxOjMsIHNpbGVudCA9IFRSVUUpCgpwMSA8LSBnZ3Bsb3QoZGF0YSA9IGZyZXFfQSwKICBhZXMoYXhpczEgPSBTZXgsIGF4aXMyID0gU3BlY2llcywgYXhpczMgPSBTdHJhaW4sIHkgPSBGcmVxKSkgKwogIGdlb21fYWxsdXZpdW0oYWVzKGZpbGwgPSBTZXgpKSArCiAgZ2VvbV9mbG93KCkgKwogIGdlb21fc3RyYXR1bShhZXMoZmlsbCA9IFNleCkpICsKICBnZW9tX3RleHQoc3RhdCA9ICJzdHJhdHVtIiwgYWVzKGxhYmVsID0gYWZ0ZXJfc3RhdChzdHJhdHVtKSkpICsKICAjdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZV92b2lkKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCwgdmp1c3QgPSAzKSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiksCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMSwgMSwgMCwgMSksICJjbSIpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCJTZXgiLCAiU3BlY2llcyIsICJTdHJhaW4iKSwgZXhwYW5kID0gYygwLjE1LCAwLjA1KSwgcG9zaXRpb24gPSAidG9wIikgKwogIGdndGl0bGUoIkEgIHN0dWR5IHN1YmplY3RzIikKCnAxCmBgYAoKIyMjIEVudmlyb25tZW50YWwgZW5yaWNobWVudCBpbmZvOiBhZ2UtZXhlcmNpc2Utc29jaWFsIEVFCgpgYGB7ciwgcmVzdWx0cyA9ICdoaWRlJywgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CgpmcmVxX0IgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShkYXQkQWdlX0VFX2V4cG9zdXJlLCBkYXQkRUVfZXhlcmNpc2UsIGRhdCRFRV9zb2NpYWwpKSAlPiUgcmVuYW1lKEFnZV9FRV9leHBvc3VyZSA9IFZhcjEsIEVFX2V4ZXJjaXNlID0gVmFyMiwgRUVfc29jaWFsID0gVmFyMykgI21ha2UgYSBkYXRhIGZyYW1lIG9mIGZyZXF1ZW5jaWVzIGZvciB0aHJlZSBzZWxlY3RlZCB2YXJpYWJsZXMKaXNfYWxsdXZpYV9mb3JtKGFzLmRhdGEuZnJhbWUoZnJlcV9CKSwgYXhlcyA9IDE6Mywgc2lsZW50ID0gVFJVRSkKCnAyIDwtIGdncGxvdChkYXRhID0gZnJlcV9CLAogIGFlcyhheGlzMSA9IEFnZV9FRV9leHBvc3VyZSwgYXhpczIgPSBFRV9leGVyY2lzZSwgYXhpczMgPSBFRV9zb2NpYWwsIHkgPSBGcmVxKSkgKwogIGdlb21fYWxsdXZpdW0oYWVzKGZpbGwgPSBBZ2VfRUVfZXhwb3N1cmUpKSArCiAgZ2VvbV9mbG93KCkgKwogIGdlb21fc3RyYXR1bShhZXMoZmlsbCA9IEFnZV9FRV9leHBvc3VyZSkpICsKICBnZW9tX3RleHQoc3RhdCA9ICJzdHJhdHVtIiwgYWVzKGxhYmVsID0gYWZ0ZXJfc3RhdChzdHJhdHVtKSkpICsKICAjdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZV92b2lkKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCwgdmp1c3QgPSAzKSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiksCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMSwgMSwgMCwgMSksICJjbSIpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCJBZ2UiLCAiRXhlcmNpc2UiLCAiU29jaWFsIiksIGV4cGFuZCA9IGMoMC4xLCAwLjEpLCBwb3NpdGlvbiA9ICJ0b3AiKSArCiAgZ2d0aXRsZSgiQiAgZW52aXJvbm1lbnRhbCBlbnJpY2htZW50IikKCnAyCmBgYAoKIyMjIFN0cmVzcyBpbmZvOiBhZ2UtZHVyYXRpb24tdHlwZSBzdHJlc3MKCmBgYHtyLCByZXN1bHRzID0gJ2hpZGUnLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KZnJlcV9DIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZGF0JEFnZV9zdHJlc3NfZXhwb3N1cmUsIGRhdCRTdHJlc3NfZHVyYXRpb24sIGRhdCRUeXBlX3N0cmVzc19leHBvc3VyZSkpICU+JSByZW5hbWUoQWdlX3N0cmVzcyA9IFZhcjEsIER1cmF0aW9uX3N0cmVzcyA9IFZhcjIsIFR5cGVfc3RyZXNzID0gVmFyMykgI21ha2UgYSBkYXRhIGZyYW1lIG9mIGZyZXF1ZW5jaWVzIGZvciB0aHJlZSBzZWxlY3RlZCB2YXJpYWJsZXMKaXNfYWxsdXZpYV9mb3JtKGFzLmRhdGEuZnJhbWUoZnJlcV9DKSwgYXhlcyA9IDE6Mywgc2lsZW50ID0gVFJVRSkKCnAzIDwtIGdncGxvdChkYXRhID0gZnJlcV9DLAogIGFlcyhheGlzMSA9IEFnZV9zdHJlc3MsIGF4aXMyID0gRHVyYXRpb25fc3RyZXNzLCBheGlzMyA9IFR5cGVfc3RyZXNzLCB5ID0gRnJlcSkpICsKICBnZW9tX2FsbHV2aXVtKGFlcyhmaWxsID0gQWdlX3N0cmVzcykpICsKICBnZW9tX2Zsb3coKSArCiAgZ2VvbV9zdHJhdHVtKGFlcyhmaWxsID0gQWdlX3N0cmVzcykpICsKICBnZW9tX3RleHQoc3RhdCA9ICJzdHJhdHVtIiwgYWVzKGxhYmVsID0gYWZ0ZXJfc3RhdChzdHJhdHVtKSkpICsKICAjdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZV92b2lkKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCwgdmp1c3QgPSAzKSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiksCiAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMSwgMSwgMCwgMSksICJjbSIpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCJBZ2UiLCAiRHVyYXRpb24iLCAiVHlwZSIpLCBleHBhbmQgPSBjKDAuMSwgMC4xKSwgcG9zaXRpb24gPSAidG9wIikgKwogIGdndGl0bGUoIkMgIHN0cmVzcyBleHBvc3VyZSIpCgpwMwpgYGAKCiMjIyBBc3NheSBpbmZvOiBMdnNNLXR5cGUtcmVpbmZvcmNlbWVudAoKYGBge3IsIHJlc3VsdHMgPSAnaGlkZScsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpmcmVxX0QgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShkYXQkTGVhcm5pbmdfdnNfbWVtb3J5LCBkYXQkVHlwZV9hc3NheSwgZGF0JFR5cGVfcmVpbmZvcmNlbWVudCkpICU+JSByZW5hbWUoTGVhcm5pbmdfTWVtb3J5ID0gVmFyMSwgVHlwZSA9IFZhcjIsIFJlaW5mb3JjZW1lbnQgPSBWYXIzKSAjbWFrZSBhIGRhdGEgZnJhbWUgb2YgZnJlcXVlbmNpZXMgZm9yIHRocmVlIHNlbGVjdGVkIHZhcmlhYmxlcwppc19hbGx1dmlhX2Zvcm0oYXMuZGF0YS5mcmFtZShmcmVxX0QpLCBheGVzID0gMTozLCBzaWxlbnQgPSBUUlVFKQoKcDQgPC0gZ2dwbG90KGRhdGEgPSBmcmVxX0QsCiAgYWVzKGF4aXMxID0gTGVhcm5pbmdfTWVtb3J5LCBheGlzMiA9IFR5cGUsIGF4aXMzID0gUmVpbmZvcmNlbWVudCwgeSA9IEZyZXEpKSArCiAgZ2VvbV9hbGx1dml1bShhZXMoZmlsbCA9IExlYXJuaW5nX01lbW9yeSkpICsKICBnZW9tX2Zsb3coKSArCiAgZ2VvbV9zdHJhdHVtKGFlcyhmaWxsID0gTGVhcm5pbmdfTWVtb3J5KSkgKwogIGdlb21fdGV4dChzdGF0ID0gInN0cmF0dW0iLCBhZXMobGFiZWwgPSBhZnRlcl9zdGF0KHN0cmF0dW0pKSkgKwogICN0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lX3ZvaWQoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLCB2anVzdCA9IDMpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dCgpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiKSwKICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygxLCAxLCAwLCAxKSwgImNtIikpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIkxlYXJuaW5nX01lbW9yeSIsICJUeXBlIiwgIlJlaW5mb3JjZW1lbnQiKSwgZXhwYW5kID0gYygwLjEsIDAuMSksIHBvc2l0aW9uID0gInRvcCIpICsKICBnZ3RpdGxlKCJEICBjb2duaXRpdmUgYXNzYXkiKQoKcDQKYGBgCgojIyMgQ29tYmluZWQgcGxvdApVc2VkIGZvciBGaWcuIDIKYGBge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQojcDEgKyBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDMiKSAjUGFzdGVsMQoKKHAxICsgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIikpIC8gKHAyICsgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIikpIC8gKHAzICsgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIikpIC8gKHA0ICsgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIikpICsgcGxvdF9sYXlvdXQobmNvbCA9IDEsIGhlaWdodHMgPSBjKDEsMSwxLDEsMSkpCgojZ2dzYXZlKGZpbGUgPSAiLi9maWdzL0FsbHV2aWFsX2RpYWdyYW1zX3YyLnBkZiIsIHdpZHRoID0gMTAsIGhlaWdodCA9IDEyLCB1bml0cyA9ICJjbSIsIGRwaSA9IDMwMCwgc2NhbGUgPSAyKSAjLCBkZXZpY2UgPSBjYWlyb19wZGYpCmBgYAoKIyBNb2RlbGxpbmcgd2l0aCBsblJSCgojIyBFbnZpcm9ubWVudGFsIGVucmljaG1lbnQKCiMjIyBNZXRhLWFuYWx5c2lzCgpgYGAge3J9CiNkYXQgPC0gcmVhZF9jc3YoaGVyZSgiRGF0YSIsIkRhdGFfcHJvY2Vzc2VkLmNzdiIpKQoKbW9kX0UwIDwtIHJtYS5tdih5aSA9IGxuUlJfRWEsIFYgPSBWQ1ZfRSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpCnN1bW1hcnkobW9kX0UwKSAKaTJfbWwobW9kX0UwKSAKCm9yY2hhcmRfcGxvdChtb2RfRTAsIG1vZCA9ICJJbnQiLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgICMgT3JjaGFyZCBwbG90IAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkrICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDUsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9ICJkYXJrb3JhbmdlIikrICMgY2hhbmdlIGNvbG91cnMKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9ImRhcmtvcmFuZ2UiKSsgCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpKSAKYGBgCgojIyMgTWV0YS1yZWdyZXNzaW9uOiB1bmktbW9kZXJhdG9yIHsudGFic2V0fQoKIyMjIyBMZWFybmluZyB2cyBNZW1vcnkKV2FzIHRoZSByZXNwb25zZSBsZWFybmluZyBvciBtZW1vcnk/CgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQptb2RfRTEgPC0gIHJtYS5tdih5aSA9IGxuUlJfRWEsIFYgPSBWQ1ZfRSwgbW9kID0gfkxlYXJuaW5nX3ZzX21lbW9yeS0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgICBkYXRhID0gZGF0KQoKc3VtbWFyeShtb2RfRTEpIApyMl9tbChtb2RfRTEpIAoKTHZzTV9FPC0gb3JjaGFyZF9wbG90KG1vZF9FMSwgbW9kID0gIkxlYXJuaW5nX3ZzX21lbW9yeSIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgeGxpbSgtMC41LCAyKSArIAogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSA1LCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSAKCkx2c01fRQpgYGAKCiMjIyMgVHlwZSBvZiBhc3NheQpUaGUgYnJvYWQgY2F0ZWdvcnkgb2YgdGhlIHR5cGUgb2YgYXNzYXkgdXNlZCB0byBtZWFzdXJlIGxlYXJuaW5nIG9yIG1lbW9yeSAKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CmRhdDEgPC0gZmlsdGVyKGRhdCwgVHlwZV9hc3NheSAlaW4lIGMoIlJlY29nbml0aW9uIiwgIkhhYml0dWF0aW9uIiwgIkNvbmRpdGlvbmluZyIpKQpWQ1ZfRTEgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0MSRsblJSVl9FLCBjbHVzdGVyID0gZGF0JFN0dWR5X0lELCByID0gMC41KQoKbW9kX0UyIDwtIHJtYS5tdih5aSA9IGxuUlJfRWEsIFYgPSBWQ1ZfRTEsIG1vZCA9IH5UeXBlX2Fzc2F5LTEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICBkYXRhID0gZGF0MSkKCnN1bW1hcnkobW9kX0UyKQpyMl9tbChtb2RfRTIpIAoKTGVhcm5pbmdfRSA8LSBvcmNoYXJkX3Bsb3QobW9kX0UyLCBtb2QgPSAiVHlwZV9hc3NheSIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgeGxpbSgtMC41LCAyKSArIAogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSA1LCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSAKCkxlYXJuaW5nX0UKYGBgCgojIyMjIFR5cGUgb2YgcmVpbmZvcmNlbWVudCAKSWYgY29uZGl0aW9uaW5nIHdhcyB1c2VkLCB3YXMgYXZlcnNpdmUgb3IgYXBwZXRpdGl2ZSByZWluZm9yY2VtZW50IHVzZWQ/CgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQoKZGF0MiA8LSBmaWx0ZXIoZGF0LCBUeXBlX3JlaW5mb3JjZW1lbnQgJWluJSBjKCJBcHBldGl0aXZlIiwgIkF2ZXJzaXZlIiwgIk5vdCBhcHBsaWNhYmxlIikpClZDVl9FMiA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQyJGxuUlJWX0UsIGNsdXN0ZXIgPSBkYXQyJFN0dWR5X0lELCByID0gMC41KQptb2RfRTMgPC0gcm1hLm12KHlpID0gbG5SUl9FYSwgViA9IFZDVl9FMiwgbW9kID0gfiBUeXBlX3JlaW5mb3JjZW1lbnQtMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdDIpCgpzdW1tYXJ5KG1vZF9FMykKcjJfbWwobW9kX0UzKSAKClJlaW5mb3JjZW1lbnRfRSA8LW9yY2hhcmRfcGxvdChtb2RfRTMsIG1vZCA9ICJUeXBlX3JlaW5mb3JjZW1lbnQiLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIHhsaW0oLTAuNSwgMikgKyAKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gNSwgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSkgCgpSZWluZm9yY2VtZW50X0UKYGBgYAoKCiMjIyMgQWdlIG9mIGVucmljaG1lbnQKVGhlIGFnZSB3aGVuIGluZGl2aWR1YWxzIHdlcmUgZXhwb3NlZCB0byBlbnZpcm9ubWVudGFsIGVucmljaG1lbnQKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CmRhdDMgPC0gZmlsdGVyKGRhdCwgQWdlX0VFX2V4cG9zdXJlICVpbiUgYygiQWR1bHQiLCAiQWRvbGVzY2VudCIpKQpWQ1ZfRTMgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0MyRsblJSVl9FLCBjbHVzdGVyID0gZGF0MyRTdHVkeV9JRCwgciA9IDAuNSkKCgptb2RfRTQgPC0gcm1hLm12KHlpID0gbG5SUl9FYSwgViA9IFZDVl9FMywgbW9kID0gfkFnZV9FRV9leHBvc3VyZS0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQzKQoKc3VtbWFyeShtb2RfRTQpIApyMl9tbChtb2RfRTQpIAoKQWdlX0U8LSBvcmNoYXJkX3Bsb3QobW9kX0U0LCBtb2QgPSAiQWdlX0VFX2V4cG9zdXJlIiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICB4bGltKC0wLjUsIDIpICsgCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDUsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgIyBjaGFuZ2UgZm9udCBzaXplcwogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpICAKCkFnZV9FCmBgYAoKIyMjIyBFeGVyY2lzZSBlbnJpY2htZW50CkRpZCBlbnJpY2htZW50IGludm9sdmUgdGhlIGFkZGl0aW9uIG9mIGFwcGFyYXR1cyBmb3Igdm9sdW50YXJ5IGV4ZXJjaXNlIChlLmcuLCBhIHdoZWVsIG9yIHRyZWFkbWlsbCk/CgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQptb2RfRTU8LSBybWEubXYoeWkgPSBsblJSX0VhLCBWID0gVkNWX0UsIG1vZCA9IH5FRV9leGVyY2lzZS0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpCgpzdW1tYXJ5KG1vZF9FNSkKcjJfbWwobW9kX0U1KSAKIApFeGVyY2lzZV9FIDwtb3JjaGFyZF9wbG90KG1vZF9FNSwgbW9kID0gIkVFX2V4ZXJjaXNlIiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICB4bGltKC0wLjUsIDIpICsgCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDUsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgIyBjaGFuZ2UgZm9udCBzaXplcwogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpIAoKRXhlcmNpc2VfRQpgYGAKCiMjIyMgU29jaWFsIGVucmljaG1lbnQKRGlkIGVucmljaG1lbnQgaW52b2x2ZSBtb3JlIGNvbnNwZWNpZmljcyAobm90ZSB0aGF0IHdlIGRpZCBub3QgaW5jbHVkZSBzdHVkaWVzIHRoYXQgb25seSBwcm92aWRlZCBzb2NpYWwgZW5yaWNobWVudCBidXQgbm8gb3RoZXIgZm9ybSBvZiBhYmlvdGljIGVucmljaG1lbnQpPwoKYGBgIHtyLCAgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CmRhdDQgPC0gZmlsdGVyKGRhdCwgRUVfc29jaWFsICVpbiUgYygiU29jaWFsIiwgIk5vbi1zb2NpYWwiKSkKVkNWX0U0IDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdDQkbG5SUlZfRSwgY2x1c3RlciA9IGRhdDQkU3R1ZHlfSUQsIHIgPSAwLjUpCiAgCm1vZF9FNjwtIHJtYS5tdih5aSA9IGxuUlJfRWEsIFYgPSBWQ1ZfRTQsIG1vZCA9IH5FRV9zb2NpYWwtMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsZGF0YSA9IGRhdDQpCgpzdW1tYXJ5KG1vZF9FNikKcjJfbWwobW9kX0U2KSAKClNvY2lhbF9FIDwtb3JjaGFyZF9wbG90KG1vZF9FNiwgbW9kID0gIkVFX3NvY2lhbCIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgeGxpbSgtMC41LCAyKSArIAogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSA1LCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgIyBjaGFuZ2UgZm9udCBzaXplcwogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpIAoKU29jaWFsX0UgCmBgYAoKIyMjICBNdWx0aS1tb2RlcmF0b3IgbW9kZWwKVGhlIGFrYWlrZSB3ZWlnaHRzIGZvciB0aGUgdG9wIHNldCBvZiBtb2RlbHMgd2l0aCBBSUMgPCA2CgpgYGAge3IsIGV2YWwgPSBGQUxTRX0KCiMgZmlsdGVyIGRhdGEgc28gdGhhdCBhbGwgSyA8IDUgYXJlIHJlbW92ZWQKZGF0X0VmbSA8LSBkYXQgJT4lCiAgZmlsdGVyKFR5cGVfYXNzYXkgJWluJSBjKCJSZWNvZ25pdGlvbiIsICJIYWJpdHVhdGlvbiIsICJDb25kaXRpb25pbmciKSwKICAgICAgICAgVHlwZV9yZWluZm9yY2VtZW50ICVpbiUgYygiQXBwZXRpdGl2ZSIsICJBdmVyc2l2ZSIsICJOb3QgYXBwbGljYWJsZSIpLAogICAgICAgICBFRV9zb2NpYWwgJWluJSBjKCJTb2NpYWwiLCAiTm9uLXNvY2lhbCIpLCAKICAgICAgICAgQWdlX0VFX2V4cG9zdXJlICVpbiUgYygiQWR1bHQiLCAiQWRvbGVzY2VudCIpKQoKVkNWX0VmbSA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXRfRWZtJGxuUlJWX0UsIGNsdXN0ZXIgPSBkYXRfRWZtJFN0dWR5X0lELCByID0gMC41KQogICAgICAgICAgICAgICAgIAptb2RfRWZtIDwtIHJtYS5tdih5aSA9IGxuUlJfU2EsIFYgPSBWQ1ZfRWZtLCBtb2QgPSB+VHlwZV9hc3NheS0xICsgTGVhcm5pbmdfdnNfbWVtb3J5ICsgVHlwZV9yZWluZm9yY2VtZW50ICsgRUVfc29jaWFsICsgRUVfZXhlcmNpc2UgKyBBZ2VfRUVfZXhwb3N1cmUgLCByYW5kb20gPSAgIGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdF9FZm0pCiNzdW1tYXJ5KG1vZF9FZm0pCiNyMl9tbChtb2RfRWZtKSAKCnJlc19FZm0gPC0gZHJlZGdlKG1vZF9FZm0sIHRyYWNlPTIpCnNhdmVSRFMocmVzX0VmbSwgZmlsZSA9IGhlcmUoIlJkYXRhIiwgInJlc19FZm0ucmRzIikpCiMgYWxzbyBzYXZpbmcgdGhlIGZ1bGwgbW9kZWwgYW5kIGRhdGEKc2F2ZVJEUyhtb2RfRWZtLCBmaWxlID0gaGVyZSgiUmRhdGEiLCAibW9kX0VmbS5yZHMiKSkKc2F2ZVJEUyhkYXRfRWZtLCBmaWxlID0gaGVyZSgiUmRhdGEiLCAiZGF0X0VmbS5yZHMiKSkKYGBgCgpgYGB7cn0KZGF0X0VmbSA8LSByZWFkUkRTKGZpbGUgPSBoZXJlKCJSZGF0YSIsICJkYXRfRWZtLnJkcyIpKQptb2RfRWZtIDwtIHJlYWRSRFMoZmlsZSA9IGhlcmUoIlJkYXRhIiwgIm1vZF9FZm0ucmRzIikpCnJlc19FZm0gPC0gcmVhZFJEUyhmaWxlID0gaGVyZSgiUmRhdGEiLCAicmVzX0VmbS5yZHMiKSkKcmVzX0VmbTI8LSBzdWJzZXQocmVzX0VmbSwgZGVsdGEgPD0gNiwgcmVjYWxjLndlaWdodHM9RkFMU0UpCmltcG9ydGFuY2UocmVzX0VmbTIpCmBgYAoKIyMjIFB1YmxpY2F0aW9uIGJpYXMgJiBzZW5zaXRpdml0eSBhbmFseXNpcwoKIyMjIyBQdWJsaWNhdGlvbiBiaWFzIHRlc3RzCgpgYGAge3IsIHJlc3VsdHMgPSAnaGlkZSd9CgojIGZ1bm5lbCBwbG90CkZ1bm5lbF9FPC1mdW5uZWwobW9kX0VmbSwgeGxhYiA9ICJsblJSIiwgeWxhYiA9ICJTdGFuZGFyZCBFcnJvciIpCkZ1bm5lbF9FCiN5ZWFyIHB1Ymxpc2hlZCB3YXMgc2NhbGVkIHByZXZpb3VzbHkgIHVuZGVyIHN0cmVzcyBQQgoKZGF0X0VmbSRzcXJ0X2ludl9lX24gPC0gd2l0aChkYXRfRWZtLCBzcXJ0KDEvQ0NfbiArIDEvRUNfbiArIDEvRVNfbiArIDEvQ1NfbikpCgpQQl9NUl9FPC0gcm1hLm12KGxuUlJfU2EsIGxuUlJWX1MsIG1vZHMgPSB+MSArIHNxcnRfaW52X2VfbiArICBMZWFybmluZ192c19tZW1vcnkgKyBZZWFyX3B1Ymxpc2hlZCArIFR5cGVfYXNzYXkgKyBUeXBlX3JlaW5mb3JjZW1lbnQgKyBFRV9zb2NpYWwgKyBFRV9leGVyY2lzZSArIEFnZV9zdHJlc3NfZXhwb3N1cmUsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksIG1ldGhvZCA9ICJSRU1MIiwgdGVzdCA9ICJ0IiwgCiAgICBkYXRhID0gZGF0X0VmbSkKCmVzdGltYXRlc19QQl9NUl9FPC0gZXN0aW1hdGVzLkNJKFBCX01SX0UpCiNlc3RpbWF0ZXNfUEJfTVJfRQoKYGBgCgojIyMjIExlYXZlLW9uZS1vdXQgYW5hbHlzaXMKCmBgYCB7ciwgZXZhbCA9IEZBTFNFfQpkYXQkU3R1ZHlfSUQgPC0gYXMuZmFjdG9yKGRhdCRTdHVkeV9JRCkKCkxlYXZlT25lT3V0X2VmZmVjdHNpemUgPC0gbGlzdCgpCmZvcihpIGluIDE6bGVuZ3RoKGxldmVscyhkYXQkU3R1ZHlfSUQpKSl7CiAgTGVhdmVPbmVPdXRfZWZmZWN0c2l6ZVtbaV1dIDwtIHJtYS5tdih5aSA9IGxuUlJfRWEsIFYgPSBsblJSVl9FLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IGxpc3QofjEgfCBTdHVkeV9JRCx+MXwgRVNfSUQsIH4xIHwgU3RyYWluKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAiUkVNTCIsIGRhdGEgPSBkYXRbZGF0JFN0dWR5X0lECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gbGV2ZWxzKGRhdCRTdHVkeV9JRClbaV0sIF0pfQoKCiMgd3JpdGluZyBmdW5jdGlvbiBmb3IgZXh0cmFjdGluZyBlc3QsIGNpLmxiLCBhbmQgY2kudWIgZnJvbSBhbGwgbW9kZWxzCmVzdC5mdW5jIDwtIGZ1bmN0aW9uKG1vZF9FMCl7CiAgZGYgPC0gZGF0YS5mcmFtZShlc3QgPSBtb2RfRTAkYiwgbG93ZXIgPSBtb2RfRTAkY2kubGIsIHVwcGVyID0gbW9kX0UwJGNpLnViKQogIHJldHVybihkZikKfQoKCiN1c2luZyBkcGx5ciB0byBmb3JtIGRhdGEgZnJhbWUKTUFfQ1ZSX0UgPC0gbGFwcGx5KExlYXZlT25lT3V0X2VmZmVjdHNpemUsIGZ1bmN0aW9uKHgpIGVzdC5mdW5jKHgpKSU+JSBiaW5kX3Jvd3MgJT4lIG11dGF0ZShsZWZ0X291dCA9IGxldmVscyhkYXQkU3R1ZHlfSUQpKQoKCnNhdmVSRFMoTUFfQ1ZSX0UsZmlsZSA9IGhlcmUoIlJkYXRhIiwgIk1BX0NWUl9FLnJkcyIpKQpgYGAKCmBgYCB7cn0KI3RlbGxpbmcgZ2dwbG90IHRvIHN0b3AgcmVvcmRlcmluZyBmYWN0b3JzCk1BX0NWUl9FIDwtIHJlYWRSRFMoZmlsZSA9IGhlcmUoIlJkYXRhIiwgIk1BX0NWUl9FLnJkcyIpKQoKTUFfQ1ZSX0UkbGVmdF9vdXQ8LSBhcy5mYWN0b3IoTUFfQ1ZSX0UkbGVmdF9vdXQpCk1BX0NWUl9FJGxlZnRfb3V0PC1mYWN0b3IoTUFfQ1ZSX0UkbGVmdF9vdXQsIGxldmVscyA9IE1BX0NWUl9FJGxlZnRfb3V0KQoKCiNwbG90dGluZwpsZWF2ZW9uZW91dF9FIDwtIGdncGxvdChNQV9DVlJfRSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIsIGx3ZCA9IDEpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtb2RfRTAkY2kubGIsIGx0eSA9IDMsIGx3ZCA9IDAuNzUsIGNvbG91ciA9ICJibGFjayIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtb2RfRTAkYiwgbHR5ID0gMSwgbHdkID0gMC43NSwgY29sb3VyID0gImJsYWNrIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1vZF9FMCRjaS51YiwgbHR5ID0gMywgbHdkID0gMC43NSwgY29sb3VyID0gImJsYWNrIikgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeCA9IGxlZnRfb3V0LCB5ID0gZXN0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlcikpICsKICB4bGFiKCJTdHVkeSBsZWZ0IG91dCIpICsgCiAgeWxhYigibG5SUiwgOTUlIENJIikgKyAKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpKwogIHRoZW1lX2J3KCkgKyB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpICkgKwogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSkKCmxlYXZlb25lb3V0X0UKCmRhdCRTdHVkeV9JRCA8LSBhcy5pbnRlZ2VyKGRhdCRTdHVkeV9JRCkKYGBgCgojIyBTdHJlc3MKCiMjIyBNZXRhLWFuYWx5c2lzCgpgYGAge3J9Cm1vZF9TMCA8LSBybWEubXYoeWkgPSBsblJSX1NhLCBWID0gVkNWX1MsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwgCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdCkKCnN1bW1hcnkobW9kX1MwKSAKaTJfbWwobW9kX1MwKSAKCm9yY2hhcmRfcGxvdChtb2RfUzAsIG1vZCA9ICJJbnQiLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSA1LCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpKSAKYGBgCgojIyMgTWV0YS1yZWdyZXNzaW9uOiB1bmktbW9kZXJhdG9yIHsudGFic2V0fQoKIyMjIyBMZWFybmluZyB2cyBNZW1vcnkKV2FzIHRoZSByZXNwb25zZSBsZWFybmluZyBvciBtZW1vcnk/CgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQoKbW9kX1MxIDwtICBybWEubXYoeWkgPSBsblJSX1NhLCBWID0gVkNWX1MsIG1vZCA9IH5MZWFybmluZ192c19tZW1vcnktMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdCkKCnN1bW1hcnkobW9kX1MxKSAKcjJfbWwobW9kX1MxKSAKCkx2c01fUyA8LSBvcmNoYXJkX3Bsb3QobW9kX1MxLCBtb2QgPSAiTGVhcm5pbmdfdnNfbWVtb3J5IiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gNSwgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSAKCkx2c01fUyAKYGBgCgojIyMjIFR5cGUgb2YgYXNzYXkKVGhlIGJyb2FkIGNhdGVnb3J5IG9mIHRoZSB0eXBlIG9mIGFzc2F5IHVzZWQgdG8gbWVhc3VyZSBsZWFybmluZyBvciBtZW1vcnkgCgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpkYXQkVHlwZV9hc3NheTwtYXMuZmFjdG9yKGRhdCRUeXBlX2Fzc2F5KQoKVkNWX1MxIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdDEkbG5SUlZfUywgY2x1c3RlciA9IGRhdCRTdHVkeV9JRCwgciA9IDAuNSkKCgptb2RfUzIgPC0gcm1hLm12KHlpID0gbG5SUl9TYSwgViA9IFZDVl9TMSwgbW9kID0gflR5cGVfYXNzYXktMSwgcmFuZG9tID0gICBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQxKQoKc3VtbWFyeShtb2RfUzIpCnIyX21sKG1vZF9TMikgCgpMZWFybmluZ19TIDwtb3JjaGFyZF9wbG90KG1vZF9TMiwgbW9kID0gIlR5cGVfYXNzYXkiLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSA1LCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSAKCkxlYXJuaW5nX1MKYGBgCgojIyMjIFR5cGUgb2YgcmVpbmZvcmNlbWVudApJZiBjb25kaXRpb25pbmcgd2FzIHVzZWQsIHdhcyBhdmVyc2l2ZSBvciBhcHBldGl0aXZlIHJlaW5mb3JjZW1lbnQgdXNlZD8KCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CgpWQ1ZfUzIgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0MiRsblJSVl9TLCBjbHVzdGVyID0gZGF0JFN0dWR5X0lELCByID0gMC41KQoKbW9kX1MzIDwtIHJtYS5tdih5aSA9IGxuUlJfU2EsIFYgPSBWQ1ZfUzIsIG1vZCA9IH4gVHlwZV9yZWluZm9yY2VtZW50LTEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQyKQoKc3VtbWFyeShtb2RfUzMpCnIyX21sKG1vZF9TMykgCgpSZWluZm9yY2VtZW50X1MgPC1vcmNoYXJkX3Bsb3QobW9kX1MzLCBtb2QgPSAiVHlwZV9yZWluZm9yY2VtZW50IiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gNSwgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSAKClJlaW5mb3JjZW1lbnRfUwpgYGBgCgojIyMjIEFnZSBvZiBzdHJlc3MKVGhlIGFnZSB3aGVuIGluZGl2aWR1YWxzIHdlcmUgZXhwb3NlZCB0byBzdHJlc3MKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9Cgptb2RfUzQgPC1ybWEubXYoeWkgPSBsblJSX1NhLCBWID0gVkNWX1MsIG1vZCA9IH5BZ2Vfc3RyZXNzX2V4cG9zdXJlLTEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpCnN1bW1hcnkobW9kX1M0KSAKcjJfbWwobW9kX1M0KSAKCkFnZV9TIDwtIG9yY2hhcmRfcGxvdChtb2RfUzQsIG1vZCA9ICJBZ2Vfc3RyZXNzX2V4cG9zdXJlIiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gNSwgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSkgCgpBZ2VfUyAKYGBgCgojIyMjIFR5cGUgb2Ygc3RyZXNzClRoZSB0eXBlIG9mIHN0cmVzc29yIHVzZWQKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CmRhdDUgPC0gZmlsdGVyKGRhdCwgVHlwZV9zdHJlc3NfZXhwb3N1cmUgJWluJSBjKCJSZXN0cmFpbnQiLCAiTm9pc2UiLCAiTVMiLCAiQ29tYmluYXRpb24iKSkKVkNWX1MzIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdDUkbG5SUlZfUywgY2x1c3RlciA9IGRhdDUkU3R1ZHlfSUQsIHIgPSAwLjUpCgptb2RfUzQgPC0gcm1hLm12KHlpID0gbG5SUl9TYSwgViA9IFZDVl9TMywgbW9kID0gflR5cGVfc3RyZXNzX2V4cG9zdXJlLTEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQ1KQpzdW1tYXJ5KG1vZF9TNCkgCnIyX21sKG1vZF9TNCkKClN0cmVzc29yPC0gb3JjaGFyZF9wbG90KG1vZF9TNCwgbW9kID0gIlR5cGVfc3RyZXNzX2V4cG9zdXJlIiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gNSwgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSkgCgpTdHJlc3NvcgpgYGBgCgojIyMjIFN0ZXNzIGR1cmF0aW9uCldhcyB0aGUgc3RyZXNzIGFjdXRlIG9yIGNocm9uaWM/CgpgYGAge3IsICBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KZGF0NiA8LSBmaWx0ZXIoZGF0LCBTdHJlc3NfZHVyYXRpb24gJWluJSBjKCJDaHJvbmljIiwgIkFjdXRlIikpClZDVl9TNCA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQ2JGxuUlJWX1MsIGNsdXN0ZXIgPSBkYXQ2JFN0dWR5X0lELCByID0gMC41KQoKbW9kX1M1IDwtcm1hLm12KHlpID0gbG5SUl9TYSwgViA9IFZDVl9TNCwgbW9kID0gflN0cmVzc19kdXJhdGlvbi0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgZGF0YSA9IGRhdDYpCnN1bW1hcnkobW9kX1M1KSAKcjJfbWwobW9kX1M1KSAKCkR1cmF0aW9uX1MgPC0gb3JjaGFyZF9wbG90KG1vZF9TNSwgbW9kID0gIlN0cmVzc19kdXJhdGlvbiIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDUsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgIyBjaGFuZ2UgZm9udCBzaXplcwogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpIAoKRHVyYXRpb25fUyAKYGBgCgojIyMgIE11bHRpLW1vZGVyYXRvciBtb2RlbApUaGUgYWthaWtlIHdlaWdodHMgZm9yIHRoZSB0b3Agc2V0IG9mIG1vZGVscyB3aXRoIEFJQyA8IDYKCmBgYCB7ciwgZXZhbCA9IEZBTFNFfQoKI3NlbGVjdGluZyBtb2RlcmF0b3IgbGV2ZWxzIHdpdGggayA+PTUKZGF0X1NmbSA8LSBkYXQgJT4lCiAgZmlsdGVyKFR5cGVfYXNzYXkgJWluJSBjKCJSZWNvZ25pdGlvbiIsICJIYWJpdHVhdGlvbiIsICJDb25kaXRpb25pbmciKSwKICAgICAgICAgVHlwZV9yZWluZm9yY2VtZW50ICVpbiUgYygiQXBwZXRpdGl2ZSIsICJBdmVyc2l2ZSIsICJOb3QgYXBwbGljYWJsZSIpLAogICAgICAgICBUeXBlX3N0cmVzc19leHBvc3VyZSAlaW4lIGMoIlJlc3RyYWludCIsICJOb2lzZSIsICJNUyIsICJDb21iaW5hdGlvbiIpLAogICAgICAgICBTdHJlc3NfZHVyYXRpb24gJWluJSBjKCJDaHJvbmljIiwgIkFjdXRlIikpCgpWQ1ZfU2ZtIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdF9TZm0kbG5SUlZfRSwgY2x1c3RlciA9IGRhdF9TZm0kU3R1ZHlfSUQsIHIgPSAwLjUpCiAgICAgICAgICAgICAgICAgCm1vZF9TZm0gPC0gcm1hLm12KHlpID0gbG5SUl9TYSwgViA9IFZDVl9TZm0sIG1vZCA9IH4gVHlwZV9hc3NheSAtMSArIExlYXJuaW5nX3ZzX21lbW9yeSArIFR5cGVfcmVpbmZvcmNlbWVudCArIFR5cGVfc3RyZXNzX2V4cG9zdXJlICsgQWdlX3N0cmVzc19leHBvc3VyZSArIFN0cmVzc19kdXJhdGlvbiwgcmFuZG9tID0gICBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRfU2ZtKQojc3VtbWFyeShtb2RfU2ZtKQojcjJfbWwobW9kX1NmbSkgCgpyZXNfU2ZtIDwtIGRyZWRnZShtb2RfU2ZtLCB0cmFjZT0yKQpzYXZlUkRTKHJlc19TZm0sIGZpbGUgPSBoZXJlKCJSZGF0YSIsICJyZXNfU2ZtLnJkcyIpKQojIGFsc28gc2F2aW5nIHRoZSBmdWxsIG1vZGVsIGFuZCBkYXRhCnNhdmVSRFMobW9kX1NmbSwgZmlsZSA9IGhlcmUoIlJkYXRhIiwgIm1vZF9TZm0ucmRzIikpCnNhdmVSRFMoZGF0X1NmbSwgZmlsZSA9IGhlcmUoIlJkYXRhIiwgImRhdF9TZm0ucmRzIikpCmBgYAoKYGBge3J9CmRhdF9TZm0gPC0gcmVhZFJEUyhmaWxlID0gaGVyZSgiUmRhdGEiLCAiZGF0X1NmbS5yZHMiKSkKbW9kX1NmbSA8LSByZWFkUkRTKGZpbGUgPSBoZXJlKCJSZGF0YSIsICJtb2RfU2ZtLnJkcyIpKQpyZXNfU2ZtIDwtIHJlYWRSRFMoZmlsZSA9IGhlcmUoIlJkYXRhIiwgInJlc19TZm0ucmRzIikpCnJlc19TZm0yPC0gc3Vic2V0KHJlc19TZm0sIGRlbHRhIDw9IDYsIHJlY2FsYy53ZWlnaHRzPUZBTFNFKQppbXBvcnRhbmNlKHJlc19TZm0yKSAKYGBgCgojIyMgUHVibGljYXRpb24gYmlhcyAmIHNlbnNpdGl2aXR5IGFuYWx5c2lzCgojIyMjIFB1YmxpY2F0aW9uIGJpYXMKCmBgYCB7ciwgcmVzdWx0cyA9ICdoaWRlJ30KIyBmdW5uZWwgcGxvdApGdW5uZWxfUyA8LSBmdW5uZWwobW9kX1NmbSwgeGxhYiA9ICJsblJSIiwgeWxhYiA9ICJTdGFuZGFyZCBFcnJvciIpCkZ1bm5lbF9TCgojY2FsY3VsYXRpbmcgaW52IGVmZmVjdGl2ZSBzYW1wbGUgc2l6ZSBmb3IgdXNlIGluIGZ1bGwgbWV0YS1yZWdyZXNzaW9uCmRhdF9TZm0kc3FydF9pbnZfZV9uIDwtIHdpdGgoZGF0X1NmbSwgc3FydCgxL0NDX24gKyAxL0VDX24gKyAxL0VTX24gKyAxL0NTX24pKQoKI3RpbWUgbGFnIGJpYXMgYW5kIGVnZ2VycyByZWdyZXNzaW9uCmRhdF9TZm0kY19ZZWFyX3B1Ymxpc2hlZCA8LSBhcy52ZWN0b3Ioc2NhbGUoZGF0X1NmbSRZZWFyX3B1Ymxpc2hlZCwgc2NhbGUgPSBGKSkKClBCX01SX1M8LSBybWEubXYobG5SUl9TYSwgbG5SUlZfUywgbW9kcyA9IH4xICsgc3FydF9pbnZfZV9uICsgIGNfWWVhcl9wdWJsaXNoZWQgKyBUeXBlX2Fzc2F5ICtMZWFybmluZ192c19tZW1vcnkgKyBUeXBlX3JlaW5mb3JjZW1lbnQgKyBUeXBlX3N0cmVzc19leHBvc3VyZSArIEFnZV9zdHJlc3NfZXhwb3N1cmUsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksIAogICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJSRU1MIiwgCiAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwgCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdF9TZm0sCiAgICAgICAgICAgICAgICAgIGNvbnRyb2w9bGlzdChvcHRpbWl6ZXI9Im9wdGltIiwgb3B0bWV0aG9kPSJOZWxkZXItTWVhZCIpKQoKZXN0aW1hdGVzX1BCX01SX1M8LSBlc3RpbWF0ZXMuQ0koUEJfTVJfUykKI2VzdGltYXRlc19QQl9NUl9TCgpgYGAKCiMjIyMgTGVhdmUtb25lLW91dCBzZW5zaXRpdml0eSBhbmFseXNpcwoKYGBgIHtyLCBldmFsID0gRkFMU0V9CmRhdCRTdHVkeV9JRCA8LSBhcy5mYWN0b3IoZGF0JFN0dWR5X0lEKQoKTGVhdmVPbmVPdXRfZWZmZWN0c2l6ZSA8LSBsaXN0KCkKZm9yKGkgaW4gMTpsZW5ndGgobGV2ZWxzKGRhdCRTdHVkeV9JRCkpKXsKICBMZWF2ZU9uZU91dF9lZmZlY3RzaXplW1tpXV0gPC0gcm1hLm12KHlpID0gbG5SUl9TYSwgViA9IGxuUlJWX1MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gbGlzdCh+MSB8IFN0dWR5X0lELH4xfCBFU19JRCwgfjEgfCBTdHJhaW4pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJSRU1MIiwgZGF0YSA9IGRhdFtkYXQkU3R1ZHlfSUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBsZXZlbHMoZGF0JFN0dWR5X0lEKVtpXSwgXSl9CgoKIyB3cml0aW5nIGZ1bmN0aW9uIGZvciBleHRyYWN0aW5nIGVzdCwgY2kubGIsIGFuZCBjaS51YiBmcm9tIGFsbCBtb2RlbHMKZXN0LmZ1bmMgPC0gZnVuY3Rpb24obW9kX0UwKXsKICBkZiA8LSBkYXRhLmZyYW1lKGVzdCA9IG1vZF9FMCRiLCBsb3dlciA9IG1vZF9FMCRjaS5sYiwgdXBwZXIgPSBtb2RfRTAkY2kudWIpCiAgcmV0dXJuKGRmKQp9CgoKI3VzaW5nIGRwbHlyIHRvIGZvcm0gZGF0YSBmcmFtZQpNQV9DVlJfUyA8LSBsYXBwbHkoTGVhdmVPbmVPdXRfZWZmZWN0c2l6ZSwgZnVuY3Rpb24oeCkgZXN0LmZ1bmMoeCkpJT4lIGJpbmRfcm93cyAlPiUgbXV0YXRlKGxlZnRfb3V0ID0gbGV2ZWxzKGRhdCRTdHVkeV9JRCkpCgpzYXZlUkRTKE1BX0NWUl9TLGZpbGUgPSBoZXJlKCJSZGF0YSIsICJNQV9DVlJfUy5yZHMiKSkKCmBgYAoKYGBgIHtyfQpNQV9DVlJfUyA8LSByZWFkUkRTKGZpbGUgPSBoZXJlKCJSZGF0YSIsICJNQV9DVlJfUy5yZHMiKSkKCiN0ZWxsaW5nIGdncGxvdCB0byBzdG9wIHJlb3JkZXJpbmcgZmFjdG9ycwpNQV9DVlJfUyRsZWZ0X291dDwtIGFzLmZhY3RvcihNQV9DVlJfUyRsZWZ0X291dCkKTUFfQ1ZSX1MkbGVmdF9vdXQ8LWZhY3RvcihNQV9DVlJfUyRsZWZ0X291dCwgbGV2ZWxzID0gTUFfQ1ZSX1MkbGVmdF9vdXQpCgojcGxvdHRpbmcKbGVhdmVvbmVvdXRfUyA8LSBnZ3Bsb3QoTUFfQ1ZSX1MpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsdHkgPSAyLCBsd2QgPSAxKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbW9kX1MwJGNpLmxiLCBsdHkgPSAzLCBsd2QgPSAwLjc1LCBjb2xvdXIgPSAiYmxhY2siKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbW9kX1MwJGIsIGx0eSA9IDEsIGx3ZCA9IDAuNzUsIGNvbG91ciA9ICJibGFjayIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtb2RfUzAkY2kudWIsIGx0eSA9IDMsIGx3ZCA9IDAuNzUsIGNvbG91ciA9ICJibGFjayIpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHggPSBsZWZ0X291dCwgeSA9IGVzdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpKSArCiAgeGxhYigiU3R1ZHkgbGVmdCBvdXQiKSArIAogIHlsYWIoImxuUlIsIDk1JSBDSSIpICsgCiAgY29vcmRfZmxpcCgpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSsKICB0aGVtZV9idygpICsgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSApICsKICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpCgpsZWF2ZW9uZW91dF9TCgpkYXQkU3R1ZHlfSUQgPC0gYXMuaW50ZWdlcihkYXQkU3R1ZHlfSUQpCmBgYAoKIyMgSW50ZXJhY3Rpb24gb2Ygc3RyZXNzIGFuZCBFRQoKIyMjIE1ldGEtYW5hbHlzaXMKCmBgYCB7cn0KbW9kX0VTMCA8LSBybWEubXYoeWkgPSBsblJSX0VTYSwgViA9IFZDVl9FUywgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwgCiAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpCgpzdW1tYXJ5KG1vZF9FUzApIAppMl9tbChtb2RfRVMwKSAKCm9yY2hhcmRfcGxvdChtb2RfRVMwLCBtb2QgPSAiSW50IiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gNSwgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjQpLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSkgCmBgYGAKCiMjIyAgTWV0YS1yZWdyZXNzaW9uOiB1bmktbW9kZXJhdG9yIHsudGFic2V0fQoKIyMjIyBMZWFybmluZyB2cyBNZW1vcnkKV2FzIHRoZSByZXNwb25zZSBsZWFybmluZyBvciBtZW1vcnk/CgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQptb2RfRVMxIDwtICBybWEubXYoeWkgPSBsblJSX0VTYSwgViA9IFZDVl9FUywgbW9kID0gfkxlYXJuaW5nX3ZzX21lbW9yeS0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0KQoKc3VtbWFyeShtb2RfRVMxKSAKcjJfbWwobW9kX0VTMSkgCgpMdnNNX0VTIDwtIG9yY2hhcmRfcGxvdChtb2RfRVMxLCBtb2QgPSAiTGVhcm5pbmdfdnNfbWVtb3J5IiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gMywgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwgIyBjaGFuZ2UgZm9udCBzaXplcwogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpIAoKTHZzTV9FUyAKYGBgCgojIyMjIFR5cGUgb2YgYXNzYXkKVGhlIGJyb2FkIGNhdGVnb3J5IG9mIHRoZSB0eXBlIG9mIGFzc2F5IHVzZWQgdG8gbWVhc3VyZSBsZWFybmluZyBvciBtZW1vcnkgCgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpWQ1ZfRVMxIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdDEkbG5SUlZfRVMsIGNsdXN0ZXIgPSBkYXQkU3R1ZHlfSUQsIHIgPSAwLjUpCgptb2RfRVMyIDwtIHJtYS5tdih5aSA9IGxuUlJfRVNhLCBWID0gVkNWX0VTMSwgbW9kID0gflR5cGVfYXNzYXktMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQxKQoKc3VtbWFyeShtb2RfRVMyKQpyMl9tbChtb2RfRVMyKSAKCkxlYXJuaW5nX0VTIDwtIG9yY2hhcmRfcGxvdChtb2RfRVMyLCBtb2QgPSAiVHlwZV9hc3NheSIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDMsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNyksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSAKCkxlYXJuaW5nX0VTCmBgYAoKIyMjIyBUeXBlIG9mIHJlaW5mb3JjZW1lbnQKSWYgY29uZGl0aW9uaW5nIHdhcyB1c2VkLCB3YXMgYXZlcnNpdmUgb3IgYXBwZXRpdGl2ZSByZWluZm9yY2VtZW50IHVzZWQ/CgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpWQ1ZfRVMyIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdDIkbG5SUlZfRVMsIGNsdXN0ZXIgPSBkYXQyJFN0dWR5X0lELCByID0gMC41KQoKbW9kX0VTMyA8LSBybWEubXYoeWkgPSBsblJSX0VTYSwgViA9IFZDVl9FUzIsIG1vZCA9IH4gVHlwZV9yZWluZm9yY2VtZW50LTEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdDIpCgpzdW1tYXJ5KG1vZF9FUzMpCnIyX21sKG1vZF9FUzMpIAoKUmVpbmZvcmNlbWVudF9FUyA8LSBvcmNoYXJkX3Bsb3QobW9kX0VTMywgbW9kID0gIlR5cGVfcmVpbmZvcmNlbWVudCIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDMsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNyksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSAKClJlaW5mb3JjZW1lbnRfRVMgCmBgYGAKCiMjIyMgQWdlIG9mIGVucmljaG1lbnQKVGhlIGFnZSB3aGVuIGluZGl2aWR1YWxzIHdlcmUgZXhwb3NlZCB0byBlbnZpcm9ubWVudGFsIGVucmljaG1lbnQKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9ClZDVl9FUzMgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0MyRsblJSVl9FUywgY2x1c3RlciA9IGRhdDMkU3R1ZHlfSUQsIHIgPSAwLjUpCgptb2RfRVM0IDwtIHJtYS5tdih5aSA9IGxuUlJfRVNhLCBWID0gVkNWX0VTMywgbW9kID0gfkFnZV9FRV9leHBvc3VyZS0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQzKQoKc3VtbWFyeShtb2RfRVM0KSAKcjJfbWwobW9kX0VTNCkgCgpBZ2VfZW5yaWNobWVudF9FUyA8LSBvcmNoYXJkX3Bsb3QobW9kX0VTNCwgbW9kID0gIkFnZV9FRV9leHBvc3VyZSIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDMsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwgIyBjaGFuZ2UgZm9udCBzaXplcwogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpIAoKQWdlX2VucmljaG1lbnRfRVMKYGBgCgojIyMjIEV4ZXJjaXNlIGVucmljaG1lbnQKRGlkIGVucmljaG1lbnQgaW52b2x2ZSB0aGUgYWRkaXRpb24gb2YgYXBwYXJhdHVzIGZvciB2b2x1bnRhcnkgZXhlcmNpc2UgKGUuZy4sIGEgd2hlZWwgb3IgdHJlYWRtaWxsKT8KCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9Cm1vZF9FUzU8LSBybWEubXYoeWkgPSBsblJSX0VTYSwgViA9IFZDVl9FUywgbW9kID0gfkVFX2V4ZXJjaXNlLTEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsIAogICAgfjF8RVNfSUQsCiAgICB+MXxTdHJhaW4pLAogICAgIHRlc3QgPSAidCIsCiAgICAgZGF0YSA9IGRhdCkKCnN1bW1hcnkobW9kX0VTNSkKcjJfbWwobW9kX0VTNSkgCgpFeGVyY2lzZV9FUyA8LSBvcmNoYXJkX3Bsb3QobW9kX0VTNSwgbW9kID0gIkVFX2V4ZXJjaXNlIiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gMywgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgCgpFeGVyY2lzZV9FUwpgYGAKCiMjIyMgU29jaWFsIGVucmljaG1lbnQKRGlkIGVucmljaG1lbnQgaW52b2x2ZSBtb3JlIGNvbnNwZWNpZmljcyAobm90ZSB0aGF0IHdlIGRpZCBub3QgaW5jbHVkZSBzdHVkaWVzIHRoYXQgb25seSBwcm92aWRlZCBzb2NpYWwgZW5yaWNobWVudCBidXQgbm8gb3RoZXIgZm9ybSBvZiBhYmlvdGljIGVucmljaG1lbnQpPwoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KVkNWX0VTNCA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQ0JGxuUlJWX0VTLCBjbHVzdGVyID0gZGF0NCRTdHVkeV9JRCwgciA9IDAuNSkKbW9kX0VTNjwtIHJtYS5tdih5aSA9IGxuUlJfRVNhLCBWID0gVkNWX0VTNCwgbW9kID0gfkVFX3NvY2lhbC0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICBkYXRhID0gZGF0NCkKCnN1bW1hcnkobW9kX0VTNikKcjJfbWwobW9kX0VTNikgCgpTb2NpYWxfRVMgPC0gb3JjaGFyZF9wbG90KG1vZF9FUzYsIG1vZCA9ICJFRV9zb2NpYWwiLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSAzLCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgCgpTb2NpYWxfRVMKYGBgCgoKIyMjIyBBZ2Ugb2Ygc3RyZXNzClRoZSBhZ2Ugd2hlbiBpbmRpdmlkdWFscyB3ZXJlIGV4cG9zZWQgdG8gc3RyZXNzCgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQptb2RfRVM3IDwtcm1hLm12KHlpID0gbG5SUl9FU2EsIFYgPSBWQ1ZfRVMsIG1vZCA9IH5BZ2Vfc3RyZXNzX2V4cG9zdXJlLTEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdCkKc3VtbWFyeShtb2RfRVM3KSAKcjJfbWwobW9kX0VTNykgCgpBZ2Vfc3RyZXNzX0VTPC1vcmNoYXJkX3Bsb3QobW9kX0VTNywgbW9kID0gIkFnZV9zdHJlc3NfZXhwb3N1cmUiLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSAzLCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNyksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSAKCkFnZV9zdHJlc3NfRVMKYGBgCgojIyMjIFR5cGUgb2Ygc3RyZXNzClRoZSB0eXBlIG9mIHN0cmVzc29yIHVzZWQKCmBgYCB7cn0KVkNWX0VTNSA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQ1JGxuUlJWX0VTLCBjbHVzdGVyID0gZGF0NSRTdHVkeV9JRCwgciA9IDAuNSkKbW9kX0VTOCA8LSBybWEubXYoeWkgPSBsblJSX0VTYSwgViA9IFZDVl9FUzUsIG1vZCA9IH5UeXBlX3N0cmVzc19leHBvc3VyZS0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQ1KQpzdW1tYXJ5KG1vZF9FUzgpCnIyX21sKG1vZF9FUzgpCgpTdHJlc3Nvcl9FUyA8LSBvcmNoYXJkX3Bsb3QobW9kX0VTOCwgbW9kID0gIlR5cGVfc3RyZXNzX2V4cG9zdXJlIiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gMywgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwgIyBjaGFuZ2UgZm9udCBzaXplcwogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICAKClN0cmVzc29yX0VTIApgYGBgCgojIyMjIFN0cmVzcyBkdXJhdGlvbgpXYXMgdGhlIHN0cmVzcyBhY3V0ZSBvciBjaHJvbmljPwoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KVkNWX0VTNiA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQ2JGxuUlJWX0VTLCBjbHVzdGVyID0gZGF0NiRTdHVkeV9JRCwgciA9IDAuNSkKCm1vZF9FUzkgPC1ybWEubXYoeWkgPSBsblJSX0VTYSwgViA9IFZDVl9FUzYsIG1vZCA9IH5TdHJlc3NfZHVyYXRpb24tMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdDYpCnN1bW1hcnkobW9kX0VTOSkgCnIyX21sKG1vZF9FUzkpIAoKCkR1cmF0aW9uX0VTPC0gb3JjaGFyZF9wbG90KG1vZF9FUzksIG1vZCA9ICJTdHJlc3NfZHVyYXRpb24iLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSAzLCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgCgpEdXJhdGlvbl9FUwpgYGAKCiMjIyMgT3JkZXIgdG8gdHJlYXRtZW50IGV4cG9zdXJlClRoZSBvcmRlciBpbiB3aGljaCBpbmRpdmlkdWFscyB3ZXJlIGV4cG9zZWQgdG8gZW5yaWNobWVudCBhbmQgc3RyZXNzCgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQptb2RfRVMxMCA8LSBybWEubXYoeWkgPSBsblJSX0VTYSwgViA9IFZDVl9FUywgbW9kID0gfkV4cG9zdXJlX29yZGVyIC0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELCAKICAgIH4xfEVTX0lELAogICAgfjF8U3RyYWluKSwKICAgICB0ZXN0ID0gInQiLAogICAgIGRhdGEgPSBkYXQpCgpzdW1tYXJ5KG1vZF9FUzEwKQpyMl9tbChtb2RfRVMxMCkKCk9yZGVyX0VTIDwtIG9yY2hhcmRfcGxvdChtb2RfRVMxMCwgbW9kID0gIkV4cG9zdXJlX29yZGVyIiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gMywgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwgIyBjaGFuZ2UgZm9udCBzaXplcwogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpIAoKT3JkZXJfRVMgCmBgYAoKIyMjICBNdWx0aS1tb2RlcmF0b3IgbW9kZWwKVGhlIGFrYWlrZSB3ZWlnaHRzIGZvciB0aGUgdG9wIHNldCBvZiBtb2RlbHMgd2l0aCBBSUMgPCA2CgpgYGAge3IsIGV2YWwgPSBGQUxTRX0KZGF0X0VTZm0gPC0gZGF0ICU+JQogIGZpbHRlcihUeXBlX2Fzc2F5ICVpbiUgYygiUmVjb2duaXRpb24iLCAiSGFiaXR1YXRpb24iLCAiQ29uZGl0aW9uaW5nIiksCiAgICAgICAgIFR5cGVfcmVpbmZvcmNlbWVudCAlaW4lIGMoIkFwcGV0aXRpdmUiLCAiQXZlcnNpdmUiLCAiTm90IGFwcGxpY2FibGUiKSwKICAgICAgICAgRUVfc29jaWFsICVpbiUgYygiU29jaWFsIiwgIk5vbi1zb2NpYWwiKSwKICAgICAgICAgQWdlX0VFX2V4cG9zdXJlICVpbiUgYygiQWR1bHQiLCAiQWRvbGVzY2VudCIpLAogICAgICAgICBUeXBlX3N0cmVzc19leHBvc3VyZSAlaW4lIGMoIlJlc3RyYWludCIsICJOb2lzZSIsICJNUyIsICJDb21iaW5hdGlvbiIpLAogICAgICAgICBTdHJlc3NfZHVyYXRpb24gJWluJSBjKCJDaHJvbmljIiwgIkFjdXRlIiksIAogICAgICAgICBBZ2Vfc3RyZXNzX2V4cG9zdXJlICVpbiUgYygiUHJlbmF0YWwiLCAiRWFybHkgcG9zdG5hdGFsIiwgIkFkdWx0IikpCgpWQ1ZfRVNmbSA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXRfRVNmbSRsblJSVl9FUywgY2x1c3RlciA9IGRhdF9FU2ZtJFN0dWR5X0lELCByID0gMC41KQogICAgICAgICAgICAgICAgIAptb2RfRVNmbSA8LSBybWEubXYoeWkgPSBsblJSX1NhLCBWID0gVkNWX0VTZm0sIG1vZCA9IH5UeXBlX2Fzc2F5LTEgKyBMZWFybmluZ192c19tZW1vcnkgKyBUeXBlX3JlaW5mb3JjZW1lbnQgKyBFRV9zb2NpYWwgKyBFRV9leGVyY2lzZSArIEFnZV9FRV9leHBvc3VyZSArIFR5cGVfc3RyZXNzX2V4cG9zdXJlICsgQWdlX3N0cmVzc19leHBvc3VyZSArIFN0cmVzc19kdXJhdGlvbiArIEV4cG9zdXJlX29yZGVyLCByYW5kb20gPSAgIGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdF9FU2ZtKQojc3VtbWFyeShtb2RfRVNmbSkKI3IyX21sKG1vZF9FU2ZtKSAKCgpyZXNfRVNmbSA8LSBkcmVkZ2UobW9kX0VTZm0sIHRyYWNlPTIpCnNhdmVSRFMocmVzX0VTZm0sIGZpbGUgPSBoZXJlKCJSZGF0YSIsICJyZXNfRVNmbS5yZHMiKSkKIyBhbHNvIHNhdmluZyB0aGUgZnVsbCBtb2RlbCBhbmQgZGF0YQpzYXZlUkRTKG1vZF9FU2ZtLCBmaWxlID0gaGVyZSgiUmRhdGEiLCAibW9kX0VTZm0ucmRzIikpCnNhdmVSRFMoZGF0X0VTZm0sIGZpbGUgPSBoZXJlKCJSZGF0YSIsICJkYXRfRVNmbS5yZHMiKSkKYGBgCgoKYGBge3J9CmRhdF9FU2ZtIDwtIHJlYWRSRFMoZmlsZSA9IGhlcmUoIlJkYXRhIiwgImRhdF9FU2ZtLnJkcyIpKQptb2RfRVNmbSA8LSByZWFkUkRTKGZpbGUgPSBoZXJlKCJSZGF0YSIsICJtb2RfRVNmbS5yZHMiKSkKcmVzX0VTZm0gPC0gcmVhZFJEUyhmaWxlID0gaGVyZSgiUmRhdGEiLCAicmVzX0VTZm0ucmRzIikpCnJlc19FU2ZtMjwtIHN1YnNldChyZXNfRVNmbSwgZGVsdGEgPD0gNiwgcmVjYWxjLndlaWdodHM9RkFMU0UpCmltcG9ydGFuY2UocmVzX0VTZm0yKSAKYGBgCgojIyMgUHVibGljYXRpb24gYmlhcyAmIHNlbnNpdGl2aXR5IGFuYWx5c2lzCgojIyMjIFB1YmxpY2F0aW9uIGJpYXMKCmBgYCB7ciwgcmVzdWx0cyA9ICdoaWRlJ30KRnVubmVsX0VTPC1mdW5uZWwobW9kX0VTZm0sIHhsYWIgPSAibG5SUiIsIHlsYWIgPSAiU3RhbmRhcmQgRXJyb3IiKQpGdW5uZWxfRVMKI3llYXIgcHVibGlzaGVkIHdhcyBzY2FsZWQgcHJldmlvdXNseSB1bmRlciBzdHJlc3MgUEIKCmRhdF9FU2ZtJHNxcnRfaW52X2VfbiA8LSB3aXRoKGRhdF9FU2ZtLCBzcXJ0KDEvQ0NfbiArIDEvRUNfbiArIDEvRVNfbiArIDEvQ1NfbikpCgpQQl9NUl9FUzwtIHJtYS5tdihsblJSX0VTYSwgbG5SUlZfRVMsIG1vZHMgPSB+MSArIHNxcnRfaW52X2VfbiArICBZZWFyX3B1Ymxpc2hlZCArIExlYXJuaW5nX3ZzX21lbW9yeSArIFR5cGVfYXNzYXkgKyBUeXBlX3JlaW5mb3JjZW1lbnQgKyBFRV9zb2NpYWwgKyBFRV9leGVyY2lzZSArIEFnZV9zdHJlc3NfZXhwb3N1cmUsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksIG1ldGhvZCA9ICJSRU1MIiwgdGVzdCA9ICJ0IiwgCiAgICBkYXRhID0gZGF0X0VTZm0pCgplc3RpbWF0ZXNfUEJfTVJfRVM8LSBlc3RpbWF0ZXMuQ0koUEJfTVJfRVMpCiNlc3RpbWF0ZXNfUEJfTVJfRVMKCmBgYAoKIyMjIyBMZWF2ZS1vbmUtb3V0IGFuYWx5c2lzCgpgYGAge3IsIGV2YWwgPSBGQUxTRX0KZGF0JFN0dWR5X0lEIDwtIGFzLmZhY3RvcihkYXQkU3R1ZHlfSUQpCgpMZWF2ZU9uZU91dF9lZmZlY3RzaXplIDwtIGxpc3QoKQpmb3IoaSBpbiAxOmxlbmd0aChsZXZlbHMoZGF0JFN0dWR5X0lEKSkpewogIExlYXZlT25lT3V0X2VmZmVjdHNpemVbW2ldXSA8LSBybWEubXYoeWkgPSBsblJSX0VhLCBWID0gbG5SUlZfRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSBsaXN0KH4xIHwgU3R1ZHlfSUQsfjF8IEVTX0lELCB+MSB8IFN0cmFpbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gIlJFTUwiLCBkYXRhID0gZGF0W2RhdCRTdHVkeV9JRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IGxldmVscyhkYXQkU3R1ZHlfSUQpW2ldLCBdKX0KCgojIHdyaXRpbmcgZnVuY3Rpb24gZm9yIGV4dHJhY3RpbmcgZXN0LCBjaS5sYiwgYW5kIGNpLnViIGZyb20gYWxsIG1vZGVscwplc3QuZnVuYyA8LSBmdW5jdGlvbihtb2RfRTApewogIGRmIDwtIGRhdGEuZnJhbWUoZXN0ID0gbW9kX0UwJGIsIGxvd2VyID0gbW9kX0UwJGNpLmxiLCB1cHBlciA9IG1vZF9FMCRjaS51YikKICByZXR1cm4oZGYpCn0KCgojdXNpbmcgZHBseXIgdG8gZm9ybSBkYXRhIGZyYW1lCk1BX0NWUl9FUyA8LSBsYXBwbHkoTGVhdmVPbmVPdXRfZWZmZWN0c2l6ZSwgZnVuY3Rpb24oeCkgZXN0LmZ1bmMoeCkpJT4lIGJpbmRfcm93cyAlPiUgbXV0YXRlKGxlZnRfb3V0ID0gbGV2ZWxzKGRhdCRTdHVkeV9JRCkpCgpzYXZlUkRTKE1BX0NWUl9FUywgLGZpbGUgPSBoZXJlKCJSZGF0YSIsICJNQV9DVlJfRVMucmRzIikpCgpgYGAKCmBgYCB7cn0KTUFfQ1ZSX0VTPC0gcmVhZFJEUyhoZXJlKCJSZGF0YSIsICJNQV9DVlJfRVMucmRzIikpCgojdGVsbGluZyBnZ3Bsb3QgdG8gc3RvcCByZW9yZGVyaW5nIGZhY3RvcnMKTUFfQ1ZSX0VTJGxlZnRfb3V0PC0gYXMuZmFjdG9yKE1BX0NWUl9FUyRsZWZ0X291dCkKTUFfQ1ZSX0VTJGxlZnRfb3V0PC1mYWN0b3IoTUFfQ1ZSX0VTJGxlZnRfb3V0LCBsZXZlbHMgPSBNQV9DVlJfRVMkbGVmdF9vdXQpCgojcGxvdHRpbmcKbGVhdmVvbmVvdXRfRVMgPC0gZ2dwbG90KE1BX0NWUl9FUykgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIsIGx3ZCA9IDEpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtb2RfRTAkY2kubGIsIGx0eSA9IDMsIGx3ZCA9IDAuNzUsIGNvbG91ciA9ICJibGFjayIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtb2RfRTAkYiwgbHR5ID0gMSwgbHdkID0gMC43NSwgY29sb3VyID0gImJsYWNrIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1vZF9FMCRjaS51YiwgbHR5ID0gMywgbHdkID0gMC43NSwgY29sb3VyID0gImJsYWNrIikgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeCA9IGxlZnRfb3V0LCB5ID0gZXN0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlcikpICsKICB4bGFiKCJTdHVkeSBsZWZ0IG91dCIpICsgCiAgeWxhYigibG5SUiwgOTUlIENJIikgKyAKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpKwogIHRoZW1lX2J3KCkgKyB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpICkgKwogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSkKCmxlYXZlb25lb3V0X0VTCgpkYXQkU3R1ZHlfSUQgPC0gYXMuaW50ZWdlcihkYXQkU3R1ZHlfSUQpCmBgYAoKIyMjIENvbWJpbmVkIG9yY2hhcmQgcGxvdAoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KbW9kX2xpc3QxIDwtIGxpc3QobW9kX0UwLCBtb2RfUzAsIG1vZF9FUzApCgptb2RfcmVzMSA8LSBsYXBwbHkobW9kX2xpc3QxLCBmdW5jdGlvbih4KSBtb2RfcmVzdWx0cyh4LCBtb2QgPSAiSW50IikpCgptZXJnZWQxIDwtIHN1Ym1lcmdlKG1vZF9yZXMxW1szXV0sIG1vZF9yZXMxW1syXV0sICBtb2RfcmVzMVtbMV1dLCBtaXggPSBUKQptZXJnZWQxJG1vZF90YWJsZSRuYW1lIDwtIGZhY3RvcihtZXJnZWQxJG1vZF90YWJsZSRuYW1lLCBsZXZlbHMgPSBjKCJJbnRyY3B0MSIsIAogICAgIkludHJjcHQyIiwgIkludHJjcHQzIiksIAogICAgbGFiZWxzID0gcmV2KGMoIkVucmljaG1lbnQgTUUiLCAiU3RyZXNzIE1FIiwgIkludGVyYWN0aW9uIikpKQoKbWVyZ2VkMSRkYXRhJG1vZGVyYXRvciA8LSBmYWN0b3IobWVyZ2VkMSRkYXRhJG1vZGVyYXRvciwgbGV2ZWxzID0gYygiSW50cmNwdDEiLCAKICAgICJJbnRyY3B0MiIsICJJbnRyY3B0MyIpLCAKICAgIGxhYmVscyA9IHJldihjKCJFbnJpY2htZW50IE1FIiwgIlN0cmVzcyBNRSIsICJJbnRlcmFjdGlvbiIpKSkKCm9yY2hhcmQxPC0gb3JjaGFyZF9wbG90KG1lcmdlZDEsIG1vZCA9ICJJbnQiLCB4bGFiID0gImxuUlIiLCBhbmdsZSA9IDApICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscyAKICB4bGltKC0yLDQuNSkgKwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSA0LCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiIzAwQUVFRiIsIiMwMEE2NTEiLCIjRUQxQzI0IikpKyAjIGNoYW5nZSBjb2xvdXJzCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiMwMEFFRUYiLCIjMDBBNjUxIiwiI0VEMUMyNCIpKSsKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSAKCm9yY2hhcmQxCmBgYAoKIyMgJ1BhaXJ3aXNlJyBlZmZlY3Qgc2l6ZXMgey50YWJzZXR9CgojIyMgRW5yaWNobWVudCByZWxhdGl2ZSB0byBjb250cm9sCgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQoKVkNWX0UyMCA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQkbG5SUlZfRTIsIGNsdXN0ZXIgPSBkYXQkU3R1ZHlfSUQsIHIgPSAwLjUpCgptb2RfRTIwIDwtIHJtYS5tdih5aSA9IGxuUlJfRTJhLCBWID0gVkNWX0UyMCwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4gMXxTdHJhaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCksCiAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwgCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdCwgCiAgICAgICAgICAgICAgICAgY29udHJvbD1saXN0KG9wdGltaXplcj0ib3B0aW0iLCBvcHRtZXRob2Q9Ik5lbGRlci1NZWFkIikpCgpzdW1tYXJ5KG1vZF9FMjApIAppMl9tbChtb2RfRTIwKSAKCm9yY2hhcmRfcGxvdChtb2RfRTIwLCBtb2QgPSAiSW50IiwgeGxhYiA9ICJsblJSIikKYGBgCgojIyMgU3RyZXNzIHJlbGF0aXZlIHRvIGNvbnRyb2wKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9ClZDVl9TMjAgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0JGxuUlJWX1MyLCBjbHVzdGVyID0gZGF0JFN0dWR5X0lELCByID0gMC41KQoKbW9kX1MyMCA8LSBybWEubXYoeWkgPSBsblJSX1MyYSwgViA9IFZDVl9TMjAsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfiAxfFN0cmFpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lEKSwKICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpCgpzdW1tYXJ5KG1vZF9TMjApIAppMl9tbChtb2RfUzIwKSAKIApvcmNoYXJkX3Bsb3QobW9kX1MyMCwgbW9kID0gIkludCIsIHhsYWIgPSAibG5SUiIpCmBgYAoKIyMjIEVucmljaG1lbnQgKyBzdHJlc3MgcmVsYXRpdmUgdG8gY29udHJvbAoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KVkNWX0VTMjAgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0JGxuUlJWX0VTMiwgY2x1c3RlciA9IGRhdCRTdHVkeV9JRCwgciA9IDAuNSkKCm1vZF9FUzIwIDwtIHJtYS5tdih5aSA9IGxuUlJfRVMyYSwgViA9IFZDVl9FUzIwLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfiAxfFN0cmFpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lEKSwKICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpCnN1bW1hcnkobW9kX0VTMjApIAppMl9tbChtb2RfRVMyMCkgCgpvcmNoYXJkX3Bsb3QobW9kX0VTMjAsIG1vZCA9ICJJbnQiLCB4bGFiID0gImxuUlIiKQpgYGAKCiMjIyBFbnJpY2htZW50ICsgc3RyZXNzIHJlbGF0aXZlIHRvIHN0cmVzcwoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KVkNWX0UzMCA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQkbG5SUlZfRTMsIGNsdXN0ZXIgPSBkYXQkU3R1ZHlfSUQsIHIgPSAwLjUpCgptb2RfRTMwIDwtIHJtYS5tdih5aSA9IGxuUlJfRTNhLCBWID0gVkNWX0UzMCwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4gMXxTdHJhaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCksCiAgICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpCnN1bW1hcnkobW9kX0UzMCkgCmkyX21sKG1vZF9FMzApIAoKb3JjaGFyZF9wbG90KG1vZF9FMzAsIG1vZCA9ICJJbnQiLCB4bGFiID0gImxuUlIiKQpgYGAKCiMjIyBFbnJpY2htZW50ICsgc3RyZXNzIHJlbGF0aXZlIHRvIGVucmljaG1lbnQKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9ClZDVl9TMzAgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0JGxuUlJWX1MzLCBjbHVzdGVyID0gZGF0JFN0dWR5X0lELCByID0gMC41KQoKbW9kX1MzMCA8LSBybWEubXYoeWkgPSBsblJSX1MzYSwgViA9IFZDVl9TMzAsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+IDF8U3RyYWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQpLAogICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgICBkYXRhID0gZGF0LAogICAgICAgICAgICAgICAgICAgY29udHJvbD1saXN0KG9wdGltaXplcj0ib3B0aW0iLCBvcHRtZXRob2Q9Ik5lbGRlci1NZWFkIikpCnN1bW1hcnkobW9kX1MzMCkgCmkyX21sKG1vZF9TMzApIAoKb3JjaGFyZF9wbG90KG1vZF9TMzAsIG1vZCA9ICJJbnQiLCB4bGFiID0gImxuUlIiKQpgYGAKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIH0KCm1vZF9saXN0MiA8LSBsaXN0KG1vZF9TMzAsIG1vZF9FMzAsIG1vZF9FUzIwLCBtb2RfUzIwLCBtb2RfRTIwKSAjcmVhcnJhbmdlZCB0aGUgb3JkZXIgc28gdGhhdCBpdCBtYXRjaGVzIGludGV4dCByZXN1bHRzCgptb2RfcmVzMiA8LSBsYXBwbHkobW9kX2xpc3QyLCBmdW5jdGlvbih4KSBtb2RfcmVzdWx0cyh4LCBtb2QgPSAiSW50IikpCgptZXJnZWQyIDwtIHN1Ym1lcmdlKG1vZF9yZXMyW1sxXV0sIG1vZF9yZXMyW1syXV0sICBtb2RfcmVzMltbM11dLCBtb2RfcmVzMltbNF1dLCAgbW9kX3JlczJbWzVdXSwgbWl4ID0gVCkKCm1lcmdlZDIkbW9kX3RhYmxlJG5hbWUgPC0gZmFjdG9yKG1lcmdlZDIkbW9kX3RhYmxlJG5hbWUsIGxldmVscyA9IGMoIkludHJjcHQxIiwgCiAgICAiSW50cmNwdDIiLCAiSW50cmNwdDMiLCAiSW50cmNwdDQiLCAiSW50cmNwdDUiKSwgCiAgICBsYWJlbHMgPSByZXYoYygiRUMvQ0MiLCAiQ1MvQ0MiLCAiRVMvQ0MiLCAiRVMvQ1MiLCAiRVMvRUMiKSkpCgptZXJnZWQyJGRhdGEkbW9kZXJhdG9yIDwtIGZhY3RvcihtZXJnZWQyJGRhdGEkbW9kZXJhdG9yLCBsZXZlbHMgPSBjKCJJbnRyY3B0MSIsIAogICAgIkludHJjcHQyIiwgIkludHJjcHQzIiwgIkludHJjcHQ0IiwgIkludHJjcHQ1IiksIAogICAgbGFiZWxzID0gcmV2KGMoIkVDL0NDIiwgIkNTL0NDIiwgIkVTL0NDIiwgIkVTL0NTIiwgIkVTL0VDIikpKQoKb3JjaGFyZDIgPC0gb3JjaGFyZF9wbG90KG1lcmdlZDIsIG1vZCA9ICJJbnQiLCB4bGFiID0gImxuUlIiLCBhbmdsZSA9IDApICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscyAKICB4bGltKC0yLDQuNSkgKwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSA0LCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIiM3QjgxQkUiLCIjRDdERjIzIiwiI0YzNzE1OCIsIiM3NUNCRjIiLCIjOTdEMkI0IikpKyAjIGNoYW5nZSBjb2xvdXJzCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM3QjgxQkUiLCIjRDdERjIzIiwiI0YzNzE1OCIsIiM3NUNCRjIiLCIjOTdEMkI0IikpKwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgIyBjaGFuZ2UgZm9udCBzaXplcwogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpIAoKYGBgCgojIyBGaWd1cmVzCgojIyMgUGFuZWwgb2YgJ2ZvY2FsJyBFUyBhbmQgJ3BhaXJ3aXNlJyBFUyBvcmNoYXJkIHBsb3RzCmBgYCB7cn0KCgpwMSA8LSBvcmNoYXJkMSArIG9yY2hhcmQyICsgIHBsb3RfYW5ub3RhdGlvbih0YWdfbGV2ZWxzID0gJ0EnKQpwMQoKI3NhdmVkIGFzIFBERjogNiB4IDE1IGluY2hlcwpgYGAKCgojIyMgUGFuZWwgb2YgbWV0YS1yZWdyZXNzaW9ucyB7LnRhYnNldH0KCiMjIyMgRW52aXJvbm1lbnRhbCBlbnJpY2htZW50CmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CiNFbnJpY2htZW50CkVfbW9kIDwtIChMdnNNX0UgKyBMZWFybmluZ19FICsgUmVpbmZvcmNlbWVudF9FKS8gKEFnZV9FICsgRXhlcmNpc2VfRSArIFNvY2lhbF9FKSArICBwbG90X2Fubm90YXRpb24odGFnX2xldmVscyA9ICdBJykKCkVfbW9kCiNzYXZlZCBhcyBwZGYgMTAgeCAxNSBpbmNoZXMKYGBgCgojIyMjIFN0cmVzcwpgYGAge3IsICBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KU19tb2QgPC0gKEx2c01fUyArIExlYXJuaW5nX1MgKyBSZWluZm9yY2VtZW50X1MpIC8gKEFnZV9TICsgU3RyZXNzb3IgKyBEdXJhdGlvbl9TKSArIHBsb3RfYW5ub3RhdGlvbih0YWdfbGV2ZWxzID0gJ0EnKQoKU19tb2QKI3NhdmVkIGFzIHBkZiAxMCB4IDE1IGluY2hlcwpgYGAKCiMjIyMgSW50ZXJhY3Rpb24KYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KRVNfbW9kIDwtIHBsb3RfZ3JpZChMdnNNX0VTLCBMZWFybmluZ19FUywgUmVpbmZvcmNlbWVudF9FUywgQWdlX2VucmljaG1lbnRfRVMsIEFnZV9zdHJlc3NfRVMsIE9yZGVyX0VTLCBFeGVyY2lzZV9FUywgU29jaWFsX0VTLCBTdHJlc3Nvcl9FUywgRHVyYXRpb25fRVMsCiAgbGFiZWxzID0gIkFVVE8iLCBuY29sID0gNSkKCkVTX21vZAojc2F2ZWQgYXMgMTAgeCAyMCBpbmNoZXMKYGBgCgojIyMgUGFuZWwgb2YgZnVubmVsIHBsb3RzCmBgYCB7ciwgZXZhbCA9IEZBTFNFfQojIEVFCgpwZGYoTlVMTCkKZGV2LmNvbnRyb2woZGlzcGxheWxpc3Q9ImVuYWJsZSIpCnBhcihtYXI9Yyg0LDQsMC4xLDApKQpBIDwtIGZ1bm5lbChtb2RfU2ZtLCB4bGFiID0gIlJlc2lkdWFscyAobG5SUikiLCB5bGFiID0gIlN0YW5kYXJkIEVycm9yIiwKICAgICAgICB4bGltID0gYygtMiwyKSwKICAgICAgICB5bGltID0gYygwLDEuMDUpKQpBIDwtIHJlY29yZFBsb3QoKQppbnZpc2libGUoZGV2Lm9mZigpKQoKIyBTdHJlc3MKCnBkZihOVUxMKQpkZXYuY29udHJvbChkaXNwbGF5bGlzdD0iZW5hYmxlIikKcGFyKG1hcj1jKDQsNCwwLjEsMCkpCkIgPC0gZnVubmVsKG1vZF9TZm0sIHhsYWIgPSAiUmVzaWR1YWxzIChsblJSKSIsIHlsYWIgPSAiU3RhbmRhcmQgRXJyb3IiLAogICAgICAgIHhsaW0gPSBjKC0yLDIpLAogICAgICAgIHlsaW0gPSBjKDAsMS4wNSkpCkIgPC0gcmVjb3JkUGxvdCgpCmludmlzaWJsZShkZXYub2ZmKCkpCgojIEludGVyYWN0aW9uCnBkZihOVUxMKQpkZXYuY29udHJvbChkaXNwbGF5bGlzdD0iZW5hYmxlIikKcGFyKG1hcj1jKDQsNCwwLjEsMCkpCkMgPC0gZnVubmVsKG1vZF9FU2ZtLCB4bGFiID0gIlJlc2lkdWFscyAobG5SUikiLCB5bGFiID0gIlN0YW5kYXJkIEVycm9yIiwKICAgICAgICB4bGltID0gYygtMiwyKSwKICAgICAgICB5bGltID0gYygwLDEuMDUpKQpDIDwtIHJlY29yZFBsb3QoKQppbnZpc2libGUoZGV2Lm9mZigpKQoKIyBwdXR0aW5nIHRvZ2V0aGVyCmdnZHJhdyhBKSArIGdnZHJhdyhCKSArIGdnZHJhdyhDKSArIHBsb3RfYW5ub3RhdGlvbih0YWdfbGV2ZWxzID0gJ0EnKQoKI3BuZyhmaWxlID0gaGVyZSgiZmlncyIsICJGaWc3X0Z1bm5lbHMucG5nIikpCiAKI2Rldi5vZmYoKQpgYGAKCmBgYHtyLCBvdXQuaGVpZ2h0PSIxMjAlIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZSgiZmlncyIsICJmdW5uZWxzLnBuZyIpKQpgYGAKCiMgTW9kZWxsaW5nIHdpdGggU01EIHsudGFic2V0fQpNb2RlbHMgYXJlIG9mIHRoZSB0aHJlZSAnZm9jYWwnIG1vZGVscyAKCiMjIEVudmlyb25tZW50YWwgRW5yaWNobWVudAoKYGBgIHtyfQoKbW9kX0UwYSA8LSBybWEubXYoeWkgPSBTTURfRWEsIFYgPSBWQ1ZfRWEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpCnN1bW1hcnkobW9kX0UwYSkKaTJfbWwobW9kX0UwYSkKCmBgYAoKIyMgU3RyZXNzCgpgYGAge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQptb2RfUzBhIDwtIHJtYS5tdih5aSA9IFNNRF9TYSwgViA9IFZDVl9TYSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgZGF0YSA9IGRhdCkKc3VtbWFyeShtb2RfUzBhKSAKaTJfbWwobW9kX1MwYSkgCgpgYGAKCiMjIEludGVyYWN0aW9uCgpgYGAge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQoKCgptb2RfRVMwYSA8LSBybWEubXYoeWkgPSBTTURfRVNhLCBWID0gVkNWX0VTYSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpCnN1bW1hcnkobW9kX0VTMGEpCmkyX21sKG1vZF9FUzBhKSAKCmBgYAoKIyBSaXNrIG9mIEJpYXMKUGVyY2VudCBvZiBzdHVkaWVzIHRoYXQgdXNlZCByYW5kb21pc2F0aW9uIGFuZCB1c2VkIGJsaW5kaW5nCmBgYCB7Un0KIyByYW5kb21pc2F0aW9uCmRhdCAlPiUgZ3JvdXBfYnkoUk9CX3JhbmRvbWlzYXRpb24pICU+JSAKICBzdW1tYXJpc2UobiA9IG5fZGlzdGluY3QoU3R1ZHlfSUQpKQoKMTUvMzAKCiNibGluZGluZwpkYXQgJT4lIGdyb3VwX2J5KFJPQl9ibGluZGluZykgJT4lIAogIHN1bW1hcmlzZShuID0gbl9kaXN0aW5jdChTdHVkeV9JRCkpCgo2LzMwCgpgYGAKCiMgU29mdHdhcmUgYW5kIHBhY2thZ2UgdmVyc2lvbnMKCmBgYHtyfQpzZXNzaW9uSW5mbygpICU+JSBwYW5kZXIoKQpgYGAKCg==